LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX2NyeXBfZXguYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEV4dGVuZGVkIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIKICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiBDUllQIGV4dGVuc2lvbiBwZXJpcGhlcmFsOgogICogICAgICAgICAgICsgRXh0ZW5kZWQgQUVTIHByb2Nlc3NpbmcgZnVuY3Rpb25zCiAgKgogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICBUaGUgQ1JZUCBleHRlbnNpb24gSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgKCMpQWZ0ZXIgQUVTLUdDTSBvciBBRVMtQ0NNICBFbmNyeXB0aW9uL0RlY3J5cHRpb24gdXNlciBjYW4gc3RhcnQgZm9sbG93aW5nIEFQSQogICAgICAgdG8gZ2V0IHRoZSAgYXV0aGVudGljYXRpb24gbWVzc2FnZXMgOgogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTR0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAoIyMpIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ29weXJpZ2h0IChjKSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjR4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCiNpZiBkZWZpbmVkIChBRVMpICB8fCBkZWZpbmVkIChDUllQKQojaWYgZGVmaW5lZCAoQ1JZUF9DUl9BTEdPTU9ERV9BRVNfR0NNKXx8IGRlZmluZWQgKEFFUykKLyoqIEBkZWZncm91cCBDUllQRXggQ1JZUEV4CiAgKiBAYnJpZWYgQ1JZUCBFeHRlbnNpb24gSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiBAewogICovCgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X1ByaXZhdGVfRGVmaW5lcwogICogQHsKICAqLwojaWYgZGVmaW5lZChBRVMpCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMFUgICAgICAgICAgICAgLyohPCBHQ00vR01BQyAob3IgQ0NNKSBpbml0IHBoYXNlICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gaGVhZGVyIHBoYXNlICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIXzEgICAgICAgICAgLyohPCBHQ00oL0NDTSkgcGF5bG9hZCBwaGFzZSAgICovCiNkZWZpbmUgQ1JZUF9QSEFTRV9GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0NSX0dDTVBIICAgICAgICAgICAgLyohPCBHQ00vR01BQyBvciBDQ00gIGZpbmFsIHBoYXNlICAqLwoKI2RlZmluZSBDUllQX09QRVJBVElOR01PREVfRU5DUllQVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVSAgICAgICAgICAgICAvKiE8IEVuY3J5cHRpb24gbW9kZSAgICovCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0tFWURFUklWQVRJT04gICAgICAgICAgICAgQUVTX0NSX01PREVfMCAgICAgICAgICAgLyohPCBLZXkgZGVyaXZhdGlvbiBtb2RlICBvbmx5IHVzZWQgd2hlbiBwZXJmb3JtaW5nIEVDQiBhbmQgQ0JDIGRlY3J5cHRpb25zICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgICAgICAgICAgICAgIEFFU19DUl9NT0RFXzEgICAgICAgICAgIC8qITwgRGVjcnlwdGlvbiAgICAgICAqLwojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQgICAgIEFFU19DUl9NT0RFICAgICAgICAgICAgIC8qITwgS2V5IGRlcml2YXRpb24gYW5kIGRlY3J5cHRpb24gb25seSB1c2VkIHdoZW4gcGVyZm9ybWluZyBFQ0IgYW5kIENCQyBkZWNyeXB0aW9ucyAgKi8KCiNlbHNlIC8qIENSWVAgKi8KCiNkZWZpbmUgQ1JZUF9QSEFTRV9JTklUICAgICAgICAgICAgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfUEhBU0VfSEVBREVSICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMAojZGVmaW5lIENSWVBfUEhBU0VfUEFZTE9BRCAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEhfMQojZGVmaW5lIENSWVBfUEhBU0VfRklOQUwgICAgICAgICAgICAgICAgQ1JZUF9DUl9HQ01fQ0NNUEgKCiNkZWZpbmUgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQgICAgICAweDAwMDAwMDAwVQojZGVmaW5lIENSWVBfT1BFUkFUSU5HTU9ERV9ERUNSWVBUICAgICAgQ1JZUF9DUl9BTEdPRElSCiNlbmRpZiAvKiBFbmQgQUVTIG9yIENSWVAgKi8KCiNkZWZpbmUgIENSWVBFeF9QSEFTRV9QUk9DRVNTICAgICAgIDB4MDJVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBwcm9jZXNzaW5nIHBoYXNlICovCiNkZWZpbmUgIENSWVBFeF9QSEFTRV9GSU5BTCAgICAgICAgIDB4MDNVICAgICAvKiE8IENSWVAgcGVyaXBoZXJhbCBpcyBpbiBmaW5hbCBwaGFzZSB0aGlzIGlzIHJlbGV2YW50IG9ubHkgd2l0aCBDQ00gYW5kIEdDTSBtb2RlcyAqLwoKLyogIENUUjAgaW5mb3JtYXRpb24gdG8gdXNlIGluIENDTSBhbGdvcml0aG0gKi8KI2RlZmluZSBDUllQX0NDTV9DVFIwXzAgICAgICAgICAgICAweDA3RkZGRkZGVQojZGVmaW5lIENSWVBfQ0NNX0NUUjBfMyAgICAgICAgICAgIDB4RkZGRkZGMDBVCgoKLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCgovKiBFeHBvcnRlZCBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9ucwogICogQHsKICAqLwoKLyoqIEBkZWZncm91cCBDUllQRXhfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBFeHRlbmRlZCBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKICAqICBAYnJpZWYgICBFeHRlbmRlZCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KICAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICMjIyMjIEV4dGVuZGVkIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0byBnZW5lcmF0ZSB0aGUgYXV0aGVudGljYXRpb24KICAgICAgICAgIFRBRyBpbiBQb2xsaW5nIG1vZGUKICAgICAgKCMpSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHCiAgICAgICgjKUhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRwogICAgICAgICB0aGV5IHNob3VsZCBiZSB1c2VkIGFmdGVyIEVuY3J5cHQvRGVjcnlwdCBvcGVyYXRpb24uCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCgovKioKICAqIEBicmllZiAgZ2VuZXJhdGUgdGhlIEdDTSBhdXRoZW50aWNhdGlvbiBUQUcuCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBBdXRoVGFnOiBQb2ludGVyIHRvIHRoZSBhdXRoZW50aWNhdGlvbiBidWZmZXIKICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBFeF9BRVNHQ01fR2VuZXJhdGVBdXRoVEFHKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQzMl90ICpBdXRoVGFnLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgdWludDMyX3QgdGlja3N0YXJ0OwogIC8qIEFzc3VtZSBmaXJzdCBJbml0LkhlYWRlclNpemUgaXMgaW4gd29yZHMgKi8KICB1aW50NjRfdCBoZWFkZXJsZW5ndGggPSAodWludDY0X3QpKGhjcnlwLT5Jbml0LkhlYWRlclNpemUpICogMzJVOyAvKiBIZWFkZXIgbGVuZ3RoIGluIGJpdHMgKi8KICB1aW50NjRfdCBpbnB1dGxlbmd0aCA9ICh1aW50NjRfdCloY3J5cC0+U2l6ZXNTdW0gKiA4VTsgLyogSW5wdXQgbGVuZ3RoIGluIGJpdHMgKi8KICB1aW50MzJfdCB0YWdhZGRyID0gKHVpbnQzMl90KUF1dGhUYWc7CgogIC8qIENvcnJlY3QgaGVhZGVybGVuZ3RoIGlmIEluaXQuSGVhZGVyU2l6ZSBpcyBhY3R1YWxseSBpbiBieXRlcyAqLwogIGlmIChoY3J5cC0+SW5pdC5IZWFkZXJXaWR0aFVuaXQgPT0gQ1JZUF9IRUFERVJXSURUSFVOSVRfQllURSkKICB7CiAgICBoZWFkZXJsZW5ndGggLz0gNFU7CiAgfQoKICBpZiAoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX1JFQURZKQogIHsKICAgIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgICAvKiBDaGVjayBpZiBpbml0aWFsaXphdGlvbiBwaGFzZSBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZCAqLwogICAgaWYgKGhjcnlwLT5QaGFzZSA9PSBDUllQRXhfUEhBU0VfUFJPQ0VTUykKICAgIHsKICAgICAgLyogQ2hhbmdlIHRoZSBDUllQIHBoYXNlICovCiAgICAgIGhjcnlwLT5QaGFzZSA9IENSWVBFeF9QSEFTRV9GSU5BTDsKICAgIH0KICAgIGVsc2UgLyogSW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZCovCiAgICB7CiAgICAgIC8qIERpc2FibGUgdGhlIFBlcmlwaGVyYWwgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgIC8qIFNlcXVlbmNlIGVycm9yIGNvZGUgZmllbGQgKi8KICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9BVVRIX1RBR19TRVFVRU5DRTsKCiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwZXJpcGhlcmFsIHN0YXRlICovCiAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgfQoKI2lmIGRlZmluZWQoQ1JZUCkKCiAgICAvKiBEaXNhYmxlIENSWVAgdG8gc3RhcnQgdGhlIGZpbmFsIHBoYXNlICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgIC8qIFNlbGVjdCBmaW5hbCBwaGFzZSAqLwogICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBDUllQX0NSX0dDTV9DQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CgogICAgLypBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuKi8KICAgIGhjcnlwLT5JbnN0YW5jZS0+Q1IgJj0gIH5DUllQX0NSX0FMR09ESVI7CgogICAgLyogRW5hYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgKi8KICAgIF9fSEFMX0NSWVBfRU5BQkxFKGhjcnlwKTsKCiAgICAvKiBXcml0ZSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gaGVhZGVyICg2NCBiaXRzKSBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMKICAgIGluIHRoZSBwYXlsb2FkICovCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xQikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JCSVQoKHVpbnQzMl90KShpbnB1dGxlbmd0aCkpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigodWludDMyX3QpKGhlYWRlcmxlbmd0aCkpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCh1aW50MzJfdCloZWFkZXJsZW5ndGgsIDE2VSk7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKHVpbnQzMl90KWlucHV0bGVuZ3RoLCAxNlUpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8zMkIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICh1aW50MzJfdCkoaW5wdXRsZW5ndGgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICB9CgogICAgLyogV2FpdCBmb3IgT0ZORSBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBDUllQX0ZMQUdfT0ZORSkpCiAgICB7CiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICBpZiAoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICB7CiAgICAgICAgaWYgKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgewogICAgICAgICAgLyogRGlzYWJsZSB0aGUgQ1JZUCBQZXJpcGhlcmFsIENsb2NrICovCiAgICAgICAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwoKICAgICAgICAgIC8qIENoYW5nZSBzdGF0ZSAqLwogICAgICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9USU1FT1VUOwogICAgICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogUmVhZCB0aGUgYXV0aGVudGljYXRpb24gVEFHIGluIHRoZSBvdXRwdXQgRklGTyAqLwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKCiNlbHNlIC8qIEFFUyovCgogICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CgogICAgLyogV3JpdGUgdGhlIG51bWJlciBvZiBiaXRzIGluIGhlYWRlciAoNjQgYml0cykgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzCiAgICBpbiB0aGUgcGF5bG9hZCAqLwogICAgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IDBVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgodWludDMyX3QpKGlucHV0bGVuZ3RoKSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkVWKCh1aW50MzJfdCkoaW5wdXRsZW5ndGgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMTZCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKHVpbnQzMl90KWhlYWRlcmxlbmd0aCwgMTZVKTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gMFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCh1aW50MzJfdClpbnB1dGxlbmd0aCwgMTZVKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMzJCKQogICAgewogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKHVpbnQzMl90KShoZWFkZXJsZW5ndGgpOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAwVTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKHVpbnQzMl90KShpbnB1dGxlbmd0aCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgIH0KICAgIC8qIFdhaXQgZm9yIENDRiBmbGFnIHRvIGJlIHJhaXNlZCAqLwogICAgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsKICAgIHdoaWxlIChIQUxfSVNfQklUX0NMUihoY3J5cC0+SW5zdGFuY2UtPlNSLCBBRVNfU1JfQ0NGKSkKICAgIHsKICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgIGlmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgIHsKICAgICAgICBpZiAoKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpIHx8IChUaW1lb3V0ID09IDBVKSkKICAgICAgICB7CiAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBDUllQIHBlcmlwaGVyYWwgY2xvY2sgKi8KICAgICAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAgICAgLyogQ2hhbmdlIHN0YXRlICovCiAgICAgICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX1RJTUVPVVQ7CiAgICAgICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovCiAgICAgICAgICBfX0hBTF9VTkxPQ0soaGNyeXApOwogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBSZWFkIHRoZSBhdXRoZW50aWNhdGlvbiBUQUcgaW4gdGhlIG91dHB1dCBGSUZPICovCiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKCiAgICAvKiBDbGVhciBDQ0YgZmxhZyAqLwogICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0NDRl9DTEVBUik7CgojZW5kaWYgLyogRW5kIEFFUyBvciBDUllQICovCgogICAgLyogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICB9CiAgZWxzZQogIHsKICAgIC8qIEJ1c3kgZXJyb3IgY29kZSBmaWVsZCAqLwogICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9CVVNZOwogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBBRVMgQ0NNIEF1dGhlbnRpY2F0aW9uIFRBRyBnZW5lcmF0aW9uLgogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgQXV0aFRhZzogUG9pbnRlciB0byB0aGUgYXV0aGVudGljYXRpb24gYnVmZmVyCiAgKiBAcGFyYW0gIFRpbWVvdXQ6IFRpbWVvdXQgZHVyYXRpb24KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQRXhfQUVTQ0NNX0dlbmVyYXRlQXV0aFRBRyhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50MzJfdCAqQXV0aFRhZywgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRhZ2FkZHIgPSAodWludDMyX3QpQXV0aFRhZzsKICB1aW50MzJfdCBjdHIwIFs0XSA9IHswfTsKICB1aW50MzJfdCBjdHIwYWRkciA9ICh1aW50MzJfdCljdHIwOwogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICAvKiBQcm9jZXNzIGxvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoY3J5cCk7CgogICAgLyogQ2hhbmdlIHRoZSBDUllQIHBlcmlwaGVyYWwgc3RhdGUgKi8KICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX0JVU1k7CgogICAgLyogQ2hlY2sgaWYgaW5pdGlhbGl6YXRpb24gcGhhc2UgaGFzIGFscmVhZHkgYmVlbiBwZXJmb3JtZWQgKi8KICAgIGlmIChoY3J5cC0+UGhhc2UgPT0gQ1JZUEV4X1BIQVNFX1BST0NFU1MpCiAgICB7CiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBwaGFzZSAqLwogICAgICBoY3J5cC0+UGhhc2UgPSBDUllQRXhfUEhBU0VfRklOQUw7CiAgICB9CiAgICBlbHNlIC8qIEluaXRpYWxpemF0aW9uIHBoYXNlIGhhcyBub3QgYmVlbiBwZXJmb3JtZWQqLwogICAgewogICAgICAvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsICovCiAgICAgIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogICAgICAvKiBTZXF1ZW5jZSBlcnJvciBjb2RlIGZpZWxkICovCiAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfQVVUSF9UQUdfU0VRVUVOQ0U7CgogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRUFEWTsKCiAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiNpZiBkZWZpbmVkKENSWVApCgogICAgLyogRGlzYWJsZSBDUllQIHRvIHN0YXJ0IHRoZSBmaW5hbCBwaGFzZSAqLwogICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAvKiBTZWxlY3QgZmluYWwgcGhhc2UgJiBBTEdPRElSIGJpdCBtdXN0IGJlIHNldCB0byCRMJIuICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIENSWVBfQ1JfR0NNX0NDTVBIIHwgQ1JZUF9DUl9BTEdPRElSLCBDUllQX1BIQVNFX0ZJTkFMIHwgQ1JZUF9PUEVSQVRJTkdNT0RFX0VOQ1JZUFQpOwoKICAgIC8qIEVuYWJsZSB0aGUgQ1JZUCBwZXJpcGhlcmFsICovCiAgICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogICAgLyogV3JpdGUgdGhlIGNvdW50ZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8sIENUUjAgaW5mb3JtYXRpb24gZnJvbSBCMAogICAgZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBhY2NvcmRpbmcgdG8gdGhlIERBVEFUWVBFKi8KICAgIGN0cjBbMF0gPSAoaGNyeXAtPkluaXQuQjBbMF0pICYgQ1JZUF9DQ01fQ1RSMF8wOwogICAgY3RyMFsxXSA9IGhjcnlwLT5Jbml0LkIwWzFdOwogICAgY3RyMFsyXSA9IGhjcnlwLT5Jbml0LkIwWzJdOwogICAgY3RyMFszXSA9IGhjcnlwLT5Jbml0LkIwWzNdICYgIENSWVBfQ0NNX0NUUjBfMzsKCiAgICBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV84QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUkVWKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JFVigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzE2QikKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgIH0KICAgIGVsc2UgaWYgKGhjcnlwLT5Jbml0LkRhdGFUeXBlID09IENSWVBfREFUQVRZUEVfMUIpCiAgICB7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU4gPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgIH0KICAgIC8qIFdhaXQgZm9yIE9GTkUgZmxhZyB0byBiZSByYWlzZWQgKi8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgICB3aGlsZSAoSEFMX0lTX0JJVF9DTFIoaGNyeXAtPkluc3RhbmNlLT5TUiwgQ1JZUF9GTEFHX09GTkUpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFJlYWQgdGhlIEF1dGggVEFHIGluIHRoZSBJTiBGSUZPICovCiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVQ7CiAgICB0YWdhZGRyICs9IDRVOwogICAgKih1aW50MzJfdCAqKSh0YWdhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVDsKICAgIHRhZ2FkZHIgKz0gNFU7CiAgICAqKHVpbnQzMl90ICopKHRhZ2FkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUOwoKI2Vsc2UgLyogQUVTICovCgogICAgLyogU2VsZWN0IGZpbmFsIHBoYXNlICovCiAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9HQ01QSCwgQ1JZUF9QSEFTRV9GSU5BTCk7CgogICAgLyogV3JpdGUgdGhlIGNvdW50ZXIgYmxvY2sgaW4gdGhlIElOIEZJRk8sIENUUjAgaW5mb3JtYXRpb24gZnJvbSBCMAogICAgZGF0YSBoYXMgdG8gYmUgc3dhcHBlZCBhY2NvcmRpbmcgdG8gdGhlIERBVEFUWVBFKi8KICAgIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzhCKQogICAgewogICAgICBjdHIwWzBdID0gKF9fUkVWKGhjcnlwLT5Jbml0LkIwWzBdKSAmIENSWVBfQ0NNX0NUUjBfMCk7CiAgICAgIGN0cjBbMV0gPSBfX1JFVihoY3J5cC0+SW5pdC5CMFsxXSk7CiAgICAgIGN0cjBbMl0gPSBfX1JFVihoY3J5cC0+SW5pdC5CMFsyXSk7CiAgICAgIGN0cjBbM10gPSAoX19SRVYoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SRVYoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgfQogICAgZWxzZSBpZiAoaGNyeXAtPkluaXQuRGF0YVR5cGUgPT0gQ1JZUF9EQVRBVFlQRV8xNkIpCiAgICB7CiAgICAgIGN0cjBbMF0gPSAoX19ST1IoKGhjcnlwLT5Jbml0LkIwWzBdKSwgMTZVKSYgQ1JZUF9DQ01fQ1RSMF8wKTsKICAgICAgY3RyMFsxXSA9ICAgX19ST1IoKGhjcnlwLT5Jbml0LkIwWzFdKSwgMTZVKTsKICAgICAgY3RyMFsyXSA9ICAgX19ST1IoKGhjcnlwLT5Jbml0LkIwWzJdKSwgMTZVKTsKICAgICAgY3RyMFszXSA9IChfX1JPUigoaGNyeXAtPkluaXQuQjBbM10pLCAxNlUpJiBDUllQX0NDTV9DVFIwXzMpOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JPUigqKHVpbnQzMl90ICopKGN0cjBhZGRyKSwgMTZVKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUk9SKCoodWludDMyX3QgKikoY3RyMGFkZHIpLCAxNlUpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19ST1IoKih1aW50MzJfdCAqKShjdHIwYWRkciksIDE2VSk7CiAgICB9CiAgICBlbHNlIGlmIChoY3J5cC0+SW5pdC5EYXRhVHlwZSA9PSBDUllQX0RBVEFUWVBFXzFCKQogICAgewogICAgICBjdHIwWzBdID0gKF9fUkJJVChoY3J5cC0+SW5pdC5CMFswXSkmIENSWVBfQ0NNX0NUUjBfMCk7CiAgICAgIGN0cjBbMV0gPSBfX1JCSVQoaGNyeXAtPkluaXQuQjBbMV0pOwogICAgICBjdHIwWzJdID0gX19SQklUKGhjcnlwLT5Jbml0LkIwWzJdKTsKICAgICAgY3RyMFszXSA9IChfX1JCSVQoaGNyeXAtPkluaXQuQjBbM10pJiBDUllQX0NDTV9DVFIwXzMpOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9IF9fUkJJVCgqKHVpbnQzMl90ICopKGN0cjBhZGRyKSk7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSBfX1JCSVQoKih1aW50MzJfdCAqKShjdHIwYWRkcikpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gX19SQklUKCoodWludDMyX3QgKikoY3RyMGFkZHIpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY3RyMFswXSA9IChoY3J5cC0+SW5pdC5CMFswXSkgJiBDUllQX0NDTV9DVFIwXzA7CiAgICAgIGN0cjBbMV0gPSBoY3J5cC0+SW5pdC5CMFsxXTsKICAgICAgY3RyMFsyXSA9IGhjcnlwLT5Jbml0LkIwWzJdOwogICAgICBjdHIwWzNdID0gaGNyeXAtPkluaXQuQjBbM10gJiAgQ1JZUF9DQ01fQ1RSMF8zOwoKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICAgIGN0cjBhZGRyICs9IDRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90ICopKGN0cjBhZGRyKTsKICAgICAgY3RyMGFkZHIgKz0gNFU7CiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QgKikoY3RyMGFkZHIpOwogICAgICBjdHIwYWRkciArPSA0VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SID0gKih1aW50MzJfdCAqKShjdHIwYWRkcik7CiAgICB9CgogICAgLyogV2FpdCBmb3IgQ0NGIGZsYWcgdG8gYmUgcmFpc2VkICovCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogICAgd2hpbGUgKEhBTF9JU19CSVRfQ0xSKGhjcnlwLT5JbnN0YW5jZS0+U1IsIEFFU19TUl9DQ0YpKQogICAgewogICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8KICAgICAgaWYgKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkKICAgICAgewogICAgICAgIGlmICgoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgIHsKICAgICAgICAgIC8qIERpc2FibGUgdGhlIENSWVAgcGVyaXBoZXJhbCBDbG9jayAqLwogICAgICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFKGhjcnlwKTsKCiAgICAgICAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KICAgICAgICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfVElNRU9VVDsKICAgICAgICAgIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAgICAgICAgIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFJlYWQgdGhlIGF1dGhlbnRpY2F0aW9uIFRBRyBpbiB0aGUgb3V0cHV0IEZJRk8gKi8KICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgdGFnYWRkciArPSA0VTsKICAgICoodWludDMyX3QgKikodGFnYWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwoKICAgIC8qIENsZWFyIENDRiBGbGFnICovCiAgICBfX0hBTF9DUllQX0NMRUFSX0ZMQUcoaGNyeXAsIENSWVBfQ0NGX0NMRUFSKTsKCiNlbmRpZiAvKiBFbmQgb2YgQUVTIHx8IENSWVAgKi8KCiAgICAvKiBDaGFuZ2UgdGhlIENSWVAgcGVyaXBoZXJhbCBzdGF0ZSAqLwogICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLwogICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAvKiBEaXNhYmxlIENSWVAgICovCiAgICBfX0hBTF9DUllQX0RJU0FCTEUoaGNyeXApOwogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEB9CiAgKi8KCiNpZiBkZWZpbmVkIChBRVMpCi8qKiBAZGVmZ3JvdXAgQ1JZUEV4X0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDIgS2V5IERlcml2YXRpb24gZnVuY3Rpb25zCiAgKiAgQGJyaWVmICAgQXV0b0tleURlcml2YXRpb24gZnVuY3Rpb25zCiAgKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAjIyMjIyBLZXkgRGVyaXZhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gRW5hYmxlIG9yIERpc2FibGUgdGhlCiAgICAgICAgICB0aGUgQXV0b0tleURlcml2YXRpb24gcGFyYW1ldGVyIGluIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUKICAgICAgICAgIFRoZXNlIGZ1bmN0aW9uIGFyZSBhbGxvd2VkIG9ubHkgaW4gVGlueUFFUyBJUC4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIEFFUyBlbmFibGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb25zCiAgKiBAcGFyYW0gIGhjcnlwOiBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZS4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgIEhBTF9DUllQRXhfRW5hYmxlQXV0b0tleURlcml2YXRpb24oQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVBRFkpCiAgewogICAgaGNyeXAtPkF1dG9LZXlEZXJpdmF0aW9uID0gRU5BQkxFOwogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICB9Cn0KLyoqCiAgKiBAYnJpZWYgIEFFUyBkaXNhYmxlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9ucwogICogQHBhcmFtICBoY3J5cDogcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkICBIQUxfQ1JZUEV4X0Rpc2FibGVBdXRvS2V5RGVyaXZhdGlvbihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9SRUFEWSkKICB7CiAgICBoY3J5cC0+QXV0b0tleURlcml2YXRpb24gPSBESVNBQkxFOwogIH0KICBlbHNlCiAgewogICAgLyogQnVzeSBlcnJvciBjb2RlIGZpZWxkICovCiAgICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfQlVTWTsKICB9Cn0KCi8qKgogICogQH0KICAqLwojZW5kaWYgLyogQUVTIG9yIEdDTSBDQ00gZGVmaW5lZCovCiNlbmRpZiAvKiBBRVMgKi8KI2VuZGlmIC8qIEhBTF9DUllQX01PRFVMRV9FTkFCTEVEICovCgovKioKICAqIEB9CiAgKi8KI2VuZGlmIC8qIFRpbnlBRVMgb3IgQ1JZUCovCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=