LyoKICogQ29weXJpZ2h0IKkgMTk5Ny0yMDA3IEFsYWNyaXRlY2gsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZAogKgogKiAkSWQ6IHN4Z2hpZi5oLHYgMS41IDIwMDgvMDcvMjQgMTk6MTg6MjIgY2hyaXMgRXhwICQKICoKICogc3hnaGlmLmg6CiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlCiAqIEFsYWNyaXRlY2ggU2FoYXJhIGhvc3QgaW50ZXJmYWNlCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVUNPREUgUmVnaXN0ZXJzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIHN0cnVjdCBfU1hHX1VDT0RFX1JFR1MgewoJLy8gQWRkcmVzcyAwIC0gMHgzRiA9IENvbW1hbmQgY29kZXMgMC0xNSBmb3IgVENCIDAuICBFeGNvZGUgMAoJdTMyIEljcjsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDAgLSBJbnQgY29udHJvbAoJdTMyIFJzdmRSZWcxOwkJLy8gQ29kZSA9IDEgLSBUT0UgLU5BCgl1MzIgUnN2ZFJlZzI7CQkvLyBDb2RlID0gMiAtIFRPRSAtTkEKCXUzMiBSc3ZkUmVnMzsJCS8vIENvZGUgPSAzIC0gVE9FIC1OQQoJdTMyIFJzdmRSZWc0OwkJLy8gQ29kZSA9IDQgLSBUT0UgLU5BCgl1MzIgUnN2ZFJlZzU7CQkvLyBDb2RlID0gNSAtIFRPRSAtTkEKCXUzMiBDYXJkVXA7CQkvLyBDb2RlID0gNiAtIE1pY3JvY29kZSBpbml0aWFsaXplZCB3aGVuIDEKCXUzMiBSc3ZkUmVnNzsJCS8vIENvZGUgPSA3IC0gVE9FIC1OQQoJdTMyIENvZGVOb3RVc2VkWzhdOwkvLyBDb2RlcyA4LTE1IG5vdCB1c2VkLiAgRXhDb2RlID0gMAoJLy8gVGhpcyBicmluZ3MgdXMgdG8gRXhDb2RlIDEgYXQgYWRkcmVzcyAweDQwID0gSW50ZXJydXB0IHN0YXR1cyBwb2ludGVyCgl1MzIgSXNwOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMQoJdTMyIFBhZEV4MVsxNV07CQkvLyBDb2RlcyAxLTE1IG5vdCB1c2VkIHdpdGggZXh0ZW5kZWQgY29kZXMKCS8vIEV4Q29kZSAyID0gSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcgoJdTMyIElzcjsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDIKCXUzMiBQYWRFeDJbMTVdOwoJLy8gRXhDb2RlIDMgPSBFdmVudCBiYXNlIHJlZ2lzdGVyLiAgTG9jYXRpb24gb2YgZXZlbnQgcmluZ3MKCXUzMiBFdmVudEJhc2U7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAzCgl1MzIgUGFkRXgzWzE1XTsKCS8vIEV4Q29kZSA0ID0gRXZlbnQgcmluZyBzaXplCgl1MzIgRXZlbnRTaXplOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gNAoJdTMyIFBhZEV4NFsxNV07CgkvLyBFeENvZGUgNSA9IFRDQiBCdWZmZXJzIGJhc2UgYWRkcmVzcwoJdTMyIFRjYkJhc2U7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSA1Cgl1MzIgUGFkRXg1WzE1XTsKCS8vIEV4Q29kZSA2ID0gVENCIENvbXBvc2l0ZSBCdWZmZXJzIGJhc2UgYWRkcmVzcwoJdTMyIFRjYkNvbXBCYXNlOwkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSA2Cgl1MzIgUGFkRXg2WzE1XTsKCS8vIEV4Q29kZSA3ID0gVHJhbnNtaXQgcmluZyBiYXNlIGFkZHJlc3MKCXUzMiBYbXRCYXNlOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gNwoJdTMyIFBhZEV4N1sxNV07CgkvLyBFeENvZGUgOCA9IFRyYW5zbWl0IHJpbmcgc2l6ZQoJdTMyIFhtdFNpemU7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSA4Cgl1MzIgUGFkRXg4WzE1XTsKCS8vIEV4Q29kZSA5ID0gUmVjZWl2ZSByaW5nIGJhc2UgYWRkcmVzcwoJdTMyIFJjdkJhc2U7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSA5Cgl1MzIgUGFkRXg5WzE1XTsKCS8vIEV4Q29kZSAxMCA9IFJlY2VpdmUgcmluZyBzaXplCgl1MzIgUmN2U2l6ZTsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDEwCgl1MzIgUGFkRXgxMFsxNV07CgkvLyBFeENvZGUgMTEgPSBSZWFkIEVFUFJPTSBDb25maWcKCXUzMiBDb25maWc7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxMQoJdTMyIFBhZEV4MTFbMTVdOwoJLy8gRXhDb2RlIDEyID0gTXVsdGljYXN0IGJpdHMgMzE6MAoJdTMyIE1jYXN0TG93OwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMTIKCXUzMiBQYWRFeDEyWzE1XTsKCS8vIEV4Q29kZSAxMyA9IE11bHRpY2FzdCBiaXRzIDYzOjMyCgl1MzIgTWNhc3RIaWdoOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMTMKCXUzMiBQYWRFeDEzWzE1XTsKCS8vIEV4Q29kZSAxNCA9IFBpbmcKCXUzMiBQaW5nOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMTQKCXUzMiBQYWRFeDE0WzE1XTsKCS8vIEV4Q29kZSAxNSA9IExpbmsgTVRVCgl1MzIgTGlua010dTsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE1Cgl1MzIgUGFkRXgxNVsxNV07CgkvLyBFeENvZGUgMTYgPSBEb3dubG9hZCBzeW5jaHJvbml6YXRpb24KCXUzMiBMb2FkU3luYzsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE2Cgl1MzIgUGFkRXgxNlsxNV07CgkvLyBFeENvZGUgMTcgPSBVcHBlciBEUkFNIGFkZHJlc3MgYml0cyBvbiAzMi1iaXQgc3lzdGVtcwoJdTMyIFVwcGVyOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMTcKCXUzMiBQYWRFeDE3WzE1XTsKCS8vIEV4Q29kZSAxOCA9IFNsb3dwYXRoIFNlbmQgSW5kZXggQWRkcmVzcwoJdTMyIFNQU2VuZEluZGV4OwkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAxOAoJdTMyIFBhZEV4MThbMTVdOwoJdTMyIFJzdmRYRjsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDE5Cgl1MzIgUGFkRXgxOVsxNV07CgkvLyBFeENvZGUgMjAgPSBBZ2dyZWdhdGlvbgoJdTMyIEFnZ3JlZ2F0aW9uOwkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyMAoJdTMyIFBhZEV4MjBbMTVdOwoJLy8gRXhDb2RlIDIxID0gUmVjZWl2ZSBNREwgcHVzaCB0aW1lcgoJdTMyIFB1c2hUaWNrczsJCS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDIxCgl1MzIgUGFkRXgyMVsxNV07CgkvLyBFeENvZGUgMjIgPSBUT0UgTkEKCXUzMiBBY2tGcmVxdWVuY3k7CS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDIyCgl1MzIgUGFkRXgyMlsxNV07CgkvLyBFeENvZGUgMjMgPSBUT0UgTkEKCXUzMiBSc3ZkUmVnMjM7Cgl1MzIgUGFkRXgyM1sxNV07CgkvLyBFeENvZGUgMjQgPSBUT0UgTkEKCXUzMiBSc3ZkUmVnMjQ7Cgl1MzIgUGFkRXgyNFsxNV07CgkvLyBFeENvZGUgMjUgPSBUT0UgTkEKCXUzMiBSc3ZkUmVnMjU7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyNQoJdTMyIFBhZEV4MjVbMTVdOwoJLy8gRXhDb2RlIDI2ID0gUmVjZWl2ZSBjaGVja3N1bSByZXF1aXJlbWVudHMKCXUzMiBSZWNlaXZlQ2hlY2tzdW07CS8vIENvZGUgPSAwIChleHRlbmRlZCksIEV4Q29kZSA9IDI2Cgl1MzIgUGFkRXgyNlsxNV07CgkvLyBFeENvZGUgMjcgPSBSU1MgUmVxdWlyZW1lbnRzCgl1MzIgUnNzOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMjcKCXUzMiBQYWRFeDI3WzE1XTsKCS8vIEV4Q29kZSAyOCA9IFJTUyBUYWJsZQoJdTMyIFJzc1RhYmxlOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMjgKCXUzMiBQYWRFeDI4WzE1XTsKCS8vIEV4Q29kZSAyOSA9IEV2ZW50IHJpbmcgcmVsZWFzZSBlbnRyaWVzCgl1MzIgRXZlbnRSZWxlYXNlOwkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAyOQoJdTMyIFBhZEV4MjlbMTVdOwoJLy8gRXhDb2RlIDMwID0gTnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVybGlzdCBjb21tYW5kcyBvbiByaW5nIDAKCXUzMiBSY3ZDbWQ7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAzMAoJdTMyIFBhZEV4MzBbMTVdOwoJLy8gRXhDb2RlIDMxID0gc2xvd3BhdGggdHJhbnNtaXQgY29tbWFuZCAtIERhdGFbMzE6MF0gPSAxCgl1MzIgWG10Q21kOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMzEKCXUzMiBQYWRFeDMxWzE1XTsKCS8vIEV4Q29kZSAzMiA9IER1bXAgY29tbWFuZAoJdTMyIER1bXBDbWQ7CQkvLyBDb2RlID0gMCAoZXh0ZW5kZWQpLCBFeENvZGUgPSAzMgoJdTMyIFBhZEV4MzJbMTVdOwoJLy8gRXhDb2RlIDMzID0gRGVidWcgY29tbWFuZAoJdTMyIERlYnVnQ21kOwkJLy8gQ29kZSA9IDAgKGV4dGVuZGVkKSwgRXhDb2RlID0gMzMKCXUzMiBQYWRFeDMzWzE1XTsKCS8vIFRoZXJlIGFyZSAxMjggcG9zc2libGUgZXh0ZW5kZWQgY29tbWFuZHMgLSBlYWNoIG9mIGFjY291bnQgZm9yIDE2CgkvLyB3b3JkcyAoaW5jbHVkaW5nIHRoZSBub24tcmVsZXZlbnQgYmFzZSBjb21tYW5kIGNvZGVzIDEtMTUpLgoJLy8gUGFkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZXNlIGhlcmUgdG8gYnJpbmcgdXMgdG8gdGhlIG5leHQgQ1BVCgkvLyBiYXNlLiAgQXMgZXh0ZW5kZWQgY29kZXMgYXJlIGFkZGVkLCByZWR1Y2UgdGhlIGZpcnN0IGFycmF5IHZhbHVlIGluCgkvLyB0aGUgZm9sbG93aW5nIGZpZWxkCgl1MzIgUGFkVG9OZXh0Q3B1Wzk0XVsxNl07CS8vIDk0ID0gMTI4IC0gMzQgKDM0ID0gRXhjb2RlcyAwIC0gMzMpCn0gU1hHX1VDT0RFX1JFR1MsICpQU1hHX1VDT0RFX1JFR1M7CgovLyBJbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAoMCkgdmFsdWVzCiNkZWZpbmUgU1hHX0lDUl9ESVNBQkxFCQkJCQkweDAwMDAwMDAwCiNkZWZpbmUgU1hHX0lDUl9FTkFCTEUJCQkJCTB4MDAwMDAwMDEKI2RlZmluZSBTWEdfSUNSX01BU0sJCQkJCTB4MDAwMDAwMDIKI2RlZmluZSBTWEdfSUNSX01TR0lEX01BU0sJCQkJMHhGRkZGMDAwMAojZGVmaW5lIFNYR19JQ1JfTVNHSURfU0hJRlQJCQkxNgojZGVmaW5lIFNYR19JQ1IoX01lc3NhZ2VJZCwgX0RhdGEpCVwKCSgoKChfTWVzc2FnZUlkKSA8PCBTWEdfSUNSX01TR0lEX1NISUZUKSAmCVwKCSAgU1hHX0lDUl9NU0dJRF9NQVNLKSB8IChfRGF0YSkpCgovLyBUaGUgTWljcm9jb2RlIHN1cHBvcnRzIHVwIHRvIDE2IFJTUyBxdWV1ZXMKI2RlZmluZSBTWEdfTUFYX1JTUwkJCQkxNgojZGVmaW5lIFNYR19NQVhfUlNTX1RBQkxFX1NJWkUJMjU2CS8vIDI1Ni1ieXRlIG1heAoKI2RlZmluZSBTWEdfUlNTX1RDUDYJCQkJMHgwMDAwMDAwMQkvLyBSU1MgVENQIG92ZXIgSVB2NgojZGVmaW5lIFNYR19SU1NfVENQNAkJCQkweDAwMDAwMDAyCS8vIFJTUyBUQ1Agb3ZlciBJUHY0CiNkZWZpbmUgU1hHX1JTU19MRUdBQ1kJCQkJMHgwMDAwMDAwNAkvLyBMaW5lLWJhc2UgaW50ZXJydXB0cwojZGVmaW5lIFNYR19SU1NfVEFCTEVfU0laRQkJCTB4MDAwMEZGMDAJLy8gVGFibGUgc2l6ZSBtYXNrCiNkZWZpbmUgU1hHX1JTU19UQUJMRV9TSElGVAkJCTgKI2RlZmluZQlTWEdfUlNTX0JBU0VfQ1BVCQkJMHgwMEZGMDAwMAkvLyBCYXNlIENQVSAobm90IHVzZWQpCiNkZWZpbmUgU1hHX1JTU19CQVNFX1NISUZUCQkJMTYKCiNkZWZpbmUgU1hHX1JDVl9JUF9DU1VNX0VOQUJMRUQJCTB4MDAwMDAwMDEJLy8gRXhDb2RlIDI2IChSZWNlaXZlQ2hlY2tzdW0pCiNkZWZpbmUgU1hHX1JDVl9UQ1BfQ1NVTV9FTkFCTEVECTB4MDAwMDAwMDIJLy8gRXhDb2RlIDI2IChSZWNlaXZlQ2hlY2tzdW0pCgojZGVmaW5lIFNYR19YTVRfQ1BVSURfU0hJRlQJCQkxNgoKI2lmIFZQQ0kKI2RlZmluZSBTWEdfQ0hFQ0tfRk9SX0hBTkdfVElNRQkJMzAwMAojZWxzZQojZGVmaW5lIFNYR19DSEVDS19GT1JfSEFOR19USU1FCQk1CiNlbmRpZgoKLyoKICogVENCIHJlZ2lzdGVycyAtIFRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIHJlZ2lzdGVyIG1lbW9yeSBhcmVhIGFzIFVDT0RFX1JFR1MKICogYWJvdmUsIGJ1dCBkZWZpbmVkIGRpZmZlcmVudGx5LiAgQml0cyAxNzowNiBvZiB0aGUgYWRkcmVzcyBkZWZpbmUgdGhlIFRDQiwKICogd2hpY2ggbWVhbnMgZWFjaCBUQ0IgYXJlYSBvY2N1cGllcyAweDQwICg2NCkgYnl0ZXMsIG9yIDE2IHUzMlMuICBXaGF0IHJlYWxseQogKiBpcyBoYXBwZW5pbmcgaXMgdGhhdCB0aGVzZSByZWdpc3RlcnMgb2NjdXB5IHRoZSAiUGFkRXhbMTVdIiBhcmVhcyBpbiB0aGUKICogU1hHX1VDT0RFX1JFR1MgZGVmaW5pdGlvbiBhYm92ZQogKi8KdHlwZWRlZiBzdHJ1Y3QgX1NYR19UQ0JfUkVHUyB7Cgl1MzIgRXhDb2RlOwkJLyogRXh0ZW5kZWQgY29kZXMgLSBzZWUgU1hHX1VDT0RFX1JFR1MgKi8KCXUzMiBYbXQ7CQkvKiBDb2RlID0gMSAtICMgb2YgWG10IGRlc2NyaXB0b3JzIGFkZGVkIHRvIHJpbmcgKi8KCXUzMiBSY3Y7CQkvKiBDb2RlID0gMiAtICMgb2YgUmN2IGRlc2NyaXB0b3JzIGFkZGVkIHRvIHJpbmcgKi8KCXUzMiBSc3ZkMTsJCS8qIENvZGUgPSAzIC0gVE9FIE5BICovCgl1MzIgUnN2ZDI7CQkvKiBDb2RlID0gNCAtIFRPRSBOQSAqLwoJdTMyIFJzdmQzOwkJLyogQ29kZSA9IDUgLSBUT0UgTkEgKi8KCXUzMiBJbnZhbGlkOwkJLyogQ29kZSA9IDYgLSBSZXNlcnZlZCBmb3IgIkNhcmRVcCIgc2VlIGFib3ZlICovCgl1MzIgUnN2ZDQ7CQkvKiBDb2RlID0gNyAtIFRPRSBOQSAqLwoJdTMyIFJzdmQ1OwkJLyogQ29kZSA9IDggLSBUT0UgTkEgKi8KCXUzMiBQYWRbN107CQkvKiBDb2RlcyA4LTE1IC0gTm90IHVzZWQuICovCn0gU1hHX1RDQl9SRUdTLCAqUFNYR19UQ0JfUkVHUzsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVNSIEZvcm1hdAogKiAgICAgICAgICAgICAgICAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogKiAgICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqICAgICAgICAgICAgICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8CiAqICAgICAgICAgICAgICAgIHxfX19ffF9fX198X19fX3xfX19ffF9fX198X19fX3xfX19ffF9fX198CiAqICAgICAgICAgICAgICAgICBeXl5eIF5eXl4gXl5eXiBeXl5eIFwgICAgICAgICAgICAgICAgIC8KICogICAgICAgICAgIEVSUiAtLXx8fHwgfHx8fCB8fHx8IHx8fHwgIC0tLS0tLS0tLS0tLS0tLS0tCiAqICAgICAgICAgRVZFTlQgLS0tfHx8IHx8fHwgfHx8fCB8fHx8ICAgICAgICAgIHwKICogICAgICAgICAgICAgICAtLS0tfHwgfHx8fCB8fHx8IHx8fHwgICAgICAgICAgfC0tIENyYXNoIEFkZHJlc3MKICogICAgICAgICAgIFVQQyAtLS0tLXwgfHx8fCB8fHx8IHx8fHwKICogICAgICAgIExFVkVOVCAtLS0tLS0tfHx8fCB8fHx8IHx8fHwKICogICAgICAgICAgUERRRiAtLS0tLS0tLXx8fCB8fHx8IHx8fHwKICogICAgICAgICBSTUlTUyAtLS0tLS0tLS18fCB8fHx8IHx8fHwKICogICAgICAgICBCUkVBSyAtLS0tLS0tLS0tfCB8fHx8IHx8fHwKICogICAgICAgSEJFQVRPSyAtLS0tLS0tLS0tLS18fHx8IHx8fHwKICogICAgICAgTk9IQkVBVCAtLS0tLS0tLS0tLS0tfHx8IHx8fHwKICogICAgICAgIEVSRlVMTCAtLS0tLS0tLS0tLS0tLXx8IHx8fHwKICogICAgICAgICBYRFJPUCAtLS0tLS0tLS0tLS0tLS18IHx8fHwKICogICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLXx8fHwKICogICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLXx8fHwtLVwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fC0tLXwtQ3B1SWQgb2YgY3Jhc2gKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS8KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBTWEdfSVNSX0VSUgkJMHg4MDAwMDAwMAkvLyBFcnJvcgojZGVmaW5lIFNYR19JU1JfRVZFTlQJCTB4NDAwMDAwMDAJLy8gRXZlbnQgcmluZyBldmVudAojZGVmaW5lIFNYR19JU1JfTk9ORTEJCTB4MjAwMDAwMDAJLy8gTm90IHVzZWQKI2RlZmluZSBTWEdfSVNSX1VQQwkJMHgxMDAwMDAwMAkvLyBEdW1wL2RlYnVnIGNvbW1hbmQgY29tcGxldGUKI2RlZmluZSBTWEdfSVNSX0xJTksJCTB4MDgwMDAwMDAJLy8gTGluayBldmVudAojZGVmaW5lIFNYR19JU1JfUERRRgkJMHgwNDAwMDAwMAkvLyBQcm9jZXNzZWQgZGF0YSBxdWV1ZSBmdWxsCiNkZWZpbmUgU1hHX0lTUl9STUlTUwkJMHgwMjAwMDAwMAkvLyBEcm9wIC0gbm8gaG9zdCBidWYKI2RlZmluZSBTWEdfSVNSX0JSRUFLCQkweDAxMDAwMDAwCS8vIEJyZWFrcG9pbnQgaGl0CiNkZWZpbmUgU1hHX0lTUl9QSU5HCQkweDAwODAwMDAwCS8vIEhlYXJ0YmVhdCByZXNwb25zZQojZGVmaW5lIFNYR19JU1JfREVBRAkJMHgwMDQwMDAwMAkvLyBDYXJkIGNyYXNoCiNkZWZpbmUgU1hHX0lTUl9FUkZVTEwJCTB4MDAyMDAwMDAJLy8gRXZlbnQgcmluZyBmdWxsCiNkZWZpbmUgU1hHX0lTUl9YRFJPUAkJMHgwMDEwMDAwMAkvLyBYTVQgRHJvcCAtIG5vIERSQU0gYnVmcyBvciBYTVQgZXJyCiNkZWZpbmUgU1hHX0lTUl9TUFNFTkQJCTB4MDAwODAwMDAJLy8gU2xvdyBzZW5kIGNvbXBsZXRlCiNkZWZpbmUgU1hHX0lTUl9DUFUJCTB4MDAwNzAwMDAJLy8gRGVhZCBDUFUgbWFzawojZGVmaW5lIFNYR19JU1JfQ1BVX1NISUZUCQkxNgkvLyBEZWFkIENQVSBzaGlmdAojZGVmaW5lIFNYR19JU1JfQ1JBU0gJCTB4MDAwMEZGRkYJLy8gQ3Jhc2ggYWRkcmVzcyBtYXNrCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEV2ZW50IFJpbmcgZW50cnkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogIDMxICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgICAgICAgIDAKICogIC5fX19fX19fX19fX19fX19fX19fLl9fX19fX19fX19fX19fX19fX18uCiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMCAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wwCQkweDAwCiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMSAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w0CQkweDA0CiAqICB8PC0tLS0tLS0tLS0tLSAgICBQYWQgMiAgICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w4IAkJMHgwOAogKiAgfDwtLS0tLS0tLS0tLSBFdmVudCBXb3JkIDAgLS0tLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MTIJCTB4MGMKICogIHw8LS0tLS0tLS0tLS0gRXZlbnQgV29yZCAxIC0tLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDE2CQkweDEwCiAqICB8PC0tLS0tLS0tLS0tLS0gVG9lcGxpdHogICAtLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wyMAkJMHgxNAogKiAgfDwtLS0tLSBMZW5ndGggLS0tLT58PC0tLS0tLSBUQ0IgSWQgLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjQJCTB4MTgKICogIHw8LS0tLS0gU3RhdHVzIC0tLS0+fEV2bnQgQ29kZXxGbHNoIENvZGV8CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDI4CQkweDFjCiAqICAgXiAgICAgICAgICAgICAgICAgICBeXl5eIF5eXl4KICogICB8LSBWQUxJRCAgICAgICAgICAgIHx8fHwgfHx8fC0gUkJVRkMKICogICAgICAgICAgICAgICAgICAgICAgIHx8fHwgfHx8LS0gU0xPV1IKICogICAgICAgICAgICAgICAgICAgICAgIHx8fHwgfHwtLS0gVU5VU0VECiAqICAgICAgICAgICAgICAgICAgICAgICB8fHx8IHwtLS0tIEZBU1RDCiAqICAgICAgICAgICAgICAgICAgICAgICB8fHx8LS0tLS0tIEZBU1RSCiAqICAgICAgICAgICAgICAgICAgICAgICB8fHwtLS0tLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICB8fC0tLS0tLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tCiAqCiAqIFNsb3dwYXRoIHN0YXR1czoKICogICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICogIHw8LS0tLS0gU3RhdHVzIC0tLS0+fEV2bnQgQ29kZXxGbHNoIENvZGV8CiAqICB8X19fX19fX19ffENtZCBJbmRleHxfX19fX19fX198X19fX19fX19ffDI4CQkweDFjCiAqICAgIF5eXiBeXl5eCiAqICAgIHx8fCB8fHx8LSBJU1RDUElQNgogKiAgICB8fHwgfHx8LS0gSVBPTkxZCiAqICAgIHx8fCB8fC0tLSBSQ1ZFUlIKICogICAgfHx8IHwtLS0tIElQQ0JBRAogKiAgICB8fHwtLS0tLS0gVENQQ0JBRAogKiAgICB8fC0tLS0tLS0gSVNUQ1BJUAogKiAgICB8LS0tLS0tLS0gU0NFUlIKICoKICovCiNwcmFnbWEgcGFjayhwdXNoLCAxKQp0eXBlZGVmIHN0cnVjdCBfU1hHX0VWRU5UIHsKCXUzMiBQYWRbMV07CQkvLyBub3QgdXNlZAoJdTMyIFNuZFVuYTsJCS8vIFNuZFVuYSB2YWx1ZQoJdTMyIFJlc2lkOwkJLy8gcmVjZWl2ZSBNREwgcmVzaWQKCXVuaW9uIHsKCQl2b2lkICpIb3N0SGFuZGxlOwkvLyBSZWNlaXZlIGhvc3QgaGFuZGxlCgkJdTMyIFJzdmQxOwkvLyBUT0UgTkEKCQlzdHJ1Y3QgewoJCQl1MzIgTm90VXNlZDsKCQkJdTMyIFJzdmQyOwkvLyBUT0UgTkEKCQl9IEZsdXNoOwoJfTsKCXUzMiBUb2VwbGl0ejsJCS8vIFJTUyBUb2VwbGl0eiBoYXNoCgl1bmlvbiB7CgkJdXNob3J0IFJzdmQzOwkvLyBUT0UgTkEKCQl1c2hvcnQgSGRyT2Zmc2V0OwkvLyBTbG93cGF0aAoJfTsKCXVzaG9ydCBMZW5ndGg7CQkvLwoJdW5zaWduZWQgY2hhciBSc3ZkNDsJLy8gVE9FIE5BCgl1bnNpZ25lZCBjaGFyIENvZGU7CS8vIEV2ZW50IGNvZGUKCXVuc2lnbmVkIGNoYXIgQ29tbWFuZEluZGV4OwkvLyBOZXcgcmluZyBpbmRleAoJdW5zaWduZWQgY2hhciBTdGF0dXM7CS8vIEV2ZW50IHN0YXR1cwp9IFNYR19FVkVOVCwgKlBTWEdfRVZFTlQ7CiNwcmFnbWEgcGFjayhwb3ApCgovLyBFdmVudCBjb2RlIGRlZmluaXRpb25zCiNkZWZpbmUgRVZFTlRfQ09ERV9CVUZGRVJTCTB4MDEJLy8gUmVjZWl2ZSBidWZmZXIgbGlzdCBjb21tYW5kIChyaW5nIDApCiNkZWZpbmUgRVZFTlRfQ09ERV9TTE9XUkNWCTB4MDIJLy8gU2xvd3BhdGggcmVjZWl2ZQojZGVmaW5lIEVWRU5UX0NPREVfVU5VU0VECTB4MDQJLy8gV2FzIHNsb3dwYXRoIGNvbW1hbmRzIGNvbXBsZXRlCgovLyBTdGF0dXMgdmFsdWVzCiNkZWZpbmUgRVZFTlRfU1RBVFVTX1ZBTElECTB4ODAJLy8gRW50cnkgdmFsaWQKCi8vIFNsb3dwYXRoIHN0YXR1cwojZGVmaW5lIEVWRU5UX1NUQVRVU19FUlJPUgkweDQwCS8vIENvbXBsZXRlZCB3aXRoIGVycm9yLiBJbmRleCBpbiBuZXh0IGJ5dGUKI2RlZmluZSBFVkVOVF9TVEFUVVNfVENQSVA0CTB4MjAJLy8gVENQSVB2NCBmcmFtZQojZGVmaW5lIEVWRU5UX1NUQVRVU19UQ1BCQUQJMHgxMAkvLyBCYWQgVENQIGNoZWNrc3VtCiNkZWZpbmUgRVZFTlRfU1RBVFVTX0lQQkFECTB4MDgJLy8gQmFkIElQIGNoZWNrc3VtCiNkZWZpbmUgRVZFTlRfU1RBVFVTX1JDVkVSUgkweDA0CS8vIFNsb3dwYXRoIHJlY2VpdmUgZXJyb3IKI2RlZmluZSBFVkVOVF9TVEFUVVNfSVBPTkxZCTB4MDIJLy8gSVAgZnJhbWUKI2RlZmluZSBFVkVOVF9TVEFUVVNfVENQSVA2CTB4MDEJLy8gVENQSVB2NiBmcmFtZQojZGVmaW5lIEVWRU5UX1NUQVRVU19UQ1BJUAkweDIxCS8vIENvbWJpbmF0aW9uIG9mIHY0IGFuZCB2NgoKLy8gRXZlbnQgcmluZwovLyBTaXplIG11c3QgYmUgcG93ZXIgb2YgMiwgYmV0d2VlbiAxMjggYW5kIDE2awojZGVmaW5lIEVWRU5UX1JJTkdfU0laRQkJNDA5NgkvLyA/PwojZGVmaW5lIEVWRU5UX1JJTkdfQkFUQ0gJMTYJLy8gSGFuZCBlbnRyaWVzIGJhY2sgMTYgYXQgYSB0aW1lLgojZGVmaW5lIEVWRU5UX0JBVENIX0xJTUlUCTI1NgkvLyBTdG9wIHByb2Nlc3NpbmcgZXZlbnRzIGFmdGVyIDI1NiAoMTYgKiAxNikKCnR5cGVkZWYgc3RydWN0IF9TWEdfRVZFTlRfUklORyB7CglTWEdfRVZFTlQgUmluZ1tFVkVOVF9SSU5HX1NJWkVdOwp9IFNYR19FVkVOVF9SSU5HLCAqUFNYR19FVkVOVF9SSU5HOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBUQ0IgQnVmZmVycwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLyBNYXhpbXVtIG51bWJlciBvZiBUQ0JTIHN1cHBvcnRlZCBieSBoYXJkd2FyZS9taWNyb2NvZGUKI2RlZmluZSBTWEdfTUFYX1RDQgkJNDA5NgovLyBNaW5pbXVtIFRDQnMgYmVmb3JlIHdlIGZhaWwgaW5pdGlhbGl6YXRpb24KI2RlZmluZSBTWEdfTUlOX1RDQgkJNTEyCi8vIFRDQiBIYXNoCi8vIFRoZSBidWNrZXQgaXMgZGV0ZXJtaW5lZCBieSBiaXRzIDExOjQgb2YgdGhlIHRvZXBsaXR6IGlmIHdlIHN1cHBvcnQgNGsKLy8gb2ZmbG9hZGVkIGNvbm5lY3Rpb25zLCAxMDo0IGlmIHdlIHN1cHBvcnQgMmsgYW5kIHNvIG9uLgojZGVmaW5lIFNYR19UQ0JfQlVDS0VUX1NISUZUCTQKI2RlZmluZSBTWEdfVENCX1BFUl9CVUNLRVQJCTE2CiNkZWZpbmUgU1hHX1RDQl9CVUNLRVRfTUFTSwkJMHhGRjAJLy8gQnVja2V0IHBvcnRpb24gb2YgVENCIElECiNkZWZpbmUgU1hHX1RDQl9FTEVNRU5UX01BU0sJMHgwMEYJLy8gRWxlbWVudCB3aXRoaW4gYnVja2V0CiNkZWZpbmUgU1hHX1RDQl9CVUNLRVRTCQkJMjU2CS8vIDI1NiAqIDE2ID0gNGsKCiNkZWZpbmUgU1hHX1RDQl9CVUZGRVJfU0laRQk1MTIJLy8gQVNTRVJUIGZvcm1hdCBpcyBjb3JyZWN0CgojZGVmaW5lIFNYR19UQ0JfUkNWUV9TSVpFCQk3MzYKCiNkZWZpbmUgU1hHX1RDQl9DT01QT1NJVEVfQlVGRkVSX1NJWkUJMTAyNAoKI2RlZmluZSBTWEdfTE9DQVRFX1RDUF9GUkFNRV9IRFIoX1RjcE9iamVjdCwgX0lQdjYpCQkJCQkJCVwKCSgoKF9UY3BPYmplY3QpLT5WbGFuSWQpID8JCQkJCQkJCQkJCQlcCgkgKChfSVB2NikgPwkJLyogVmxhbiBmcmFtZSBoZWFkZXIgPSB5ZXMgKi8JCQkJCQkJXAoJICAmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5IYXNWbGFuLlRjcElwNi5TeGdUY3AJCQk6CVwKCSAgJihfVGNwT2JqZWN0KS0+Q29tcEJ1ZmZlci0+RnJhbWUuSGFzVmxhbi5UY3BJcC5TeGdUY3ApCQkJOiAJXAoJICgoX0lQdjYpID8JCS8qIFZsYW4gZnJhbWUgaGVhZGVyID0gTm8gKi8JCQkJCQkJXAoJICAmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5Ob1ZsYW4uVGNwSXA2LlN4Z1RjcAkJCQk6IAlcCgkgICYoX1RjcE9iamVjdCktPkNvbXBCdWZmZXItPkZyYW1lLk5vVmxhbi5UY3BJcC5TeGdUY3ApKQoKI2RlZmluZSBTWEdfTE9DQVRFX0lQX0ZSQU1FX0hEUihfVGNwT2JqZWN0KQkJCQkJCQkJCVwKCShfVGNwT2JqZWN0KS0+VmxhbklkID8JCQkJCQkJCQkJCQkJXAoJJihfVGNwT2JqZWN0KS0+Q29tcEJ1ZmZlci0+RnJhbWUuSGFzVmxhbi5UY3BJcC5JcAkJCQk6IAkJXAoJJihfVGNwT2JqZWN0KS0+Q29tcEJ1ZmZlci0+RnJhbWUuTm9WbGFuLlRjcElwLklwCgojZGVmaW5lIFNYR19MT0NBVEVfSVA2X0ZSQU1FX0hEUihfVGNwT2JqZWN0KQkJCQkJCQkJXAoJKF9UY3BPYmplY3QpLT5WbGFuSWQgPwkJCQkJCQkJCQkJCQlcCgkmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5IYXNWbGFuLlRjcElwNi5JcAkJCQk6CQlcCgkmKF9UY3BPYmplY3QpLT5Db21wQnVmZmVyLT5GcmFtZS5Ob1ZsYW4uVGNwSXA2LklwCgojaWYgREJHCi8vIEhvcnJpYmxlIGtsdWRnZSB0byBkaXN0aW5ndWlzaCBkdW1iLW5pYywgc2xvd3BhdGgsIGFuZAovLyBmYXN0cGF0aCB0cmFmZmljLiAgRGVjcmVtZW50IHRoZSBIb3BMaW1pdCBieSBvbmUKLy8gZm9yIHNsb3dwYXRoLCB0d28gZm9yIGZhc3RwYXRoLiAgVGhpcyBhc3N1bWVzIHRoZSBsaW1pdCBpcyBtZWFzdXJhYmx5Ci8vIGdyZWF0ZXIgdGhhbiB0d28sIHdoaWNoIEkgdGhpbmsgaXMgcmVhc29uYWJsZS4KLy8gT2J2aW91c2x5IHRoaXMgaXMgREJHIG9ubHkuICBNYXliZSByZW1vdmUgbGF0ZXIsIG9yICNpZiAwIHNvIHdlCi8vIGNhbiBzZXQgaXQgd2hlbiBuZWVkZWQKI2RlZmluZSBTWEdfREJHX0hPUF9MSU1JVChfVGNwT2JqZWN0LCBfRmFzdFBhdGgpIHsJCQkJCQkJCVwKCVBJUFY2X0hEUgkJX0lwNkZyYW1lSGRyOwkJCQkJCQkJCQkJCVwKCWlmKChfVGNwT2JqZWN0KS0+SVB2NikgewkJCQkJCQkJCQkJCQlcCgkJX0lwNkZyYW1lSGRyID0gU1hHX0xPQ0FURV9JUDZfRlJBTUVfSERSKChfVGNwT2JqZWN0KSk7CQkJCQlcCgkJaWYoX0Zhc3RQYXRoKSB7CQkJCQkJCQkJCQkJCQkJXAoJCQlfSXA2RnJhbWVIZHItPkhvcExpbWl0ID0gKF9UY3BPYmplY3QpLT5DYWNoZWQuVHRsT3JIb3BMaW1pdCAtIDI7CVwKCQl9IGVsc2UgewkJCQkJCQkJCQkJCQkJCQlcCgkJCV9JcDZGcmFtZUhkci0+SG9wTGltaXQgPSAoX1RjcE9iamVjdCktPkNhY2hlZC5UdGxPckhvcExpbWl0IC0gMTsJXAoJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCgl9CQkJCQkJCQkJCQkJCQkJCQkJCVwKfQojZWxzZQovLyBEbyBub3RoaW5nIHdpdGggZnJlZSBidWlsZAojZGVmaW5lIFNYR19EQkdfSE9QX0xJTUlUKF9UY3BPYmplY3QsIF9GYXN0UGF0aCkKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmdzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgU1hHX01BWF9SSU5HX1NJWkUJMjU2CiNkZWZpbmUgU1hHX1hNVF9SSU5HX1NJWkUJMTI4CS8vIFN0YXJ0IHdpdGggMTI4CiNkZWZpbmUgU1hHX1JDVl9SSU5HX1NJWkUJMTI4CS8vIFN0YXJ0IHdpdGggMTI4CiNkZWZpbmUgU1hHX01BWF9FTlRSSUVTICAgICA0MDk2CgovLyBTdHJ1Y3R1cmUgYW5kIG1hY3JvcyB0byBtYW5hZ2UgYSByaW5nCnR5cGVkZWYgc3RydWN0IF9TWEdfUklOR19JTkZPIHsKCXVuc2lnbmVkIGNoYXIgSGVhZDsJLy8gV2hlcmUgd2UgYWRkIGVudHJpZXMgLSBOb3RlIHVuc2lnbmVkIGNoYXI6UklOR19TSVpFCgl1bnNpZ25lZCBjaGFyIFRhaWw7CS8vIFdoZXJlIHdlIHB1bGwgb2ZmIGNvbXBsZXRlZCBlbnRyaWVzCgl1c2hvcnQgU2l6ZTsJCS8vIFJpbmcgc2l6ZSAtIE11c3QgYmUgbXVsdGlwbGUgb2YgMgoJdm9pZCAqQ29udGV4dFtTWEdfTUFYX1JJTkdfU0laRV07CS8vIFNoYWRvdyByaW5nCn0gU1hHX1JJTkdfSU5GTywgKlBTWEdfUklOR19JTkZPOwoKI2RlZmluZSBTWEdfSU5JVElBTElaRV9SSU5HKF9yaW5nLCBfc2l6ZSkgewkJCQkJCQlcCgkoX3JpbmcpLkhlYWQgPSAwOwkJCQkJCQkJCQkJCVwKCShfcmluZykuVGFpbCA9IDA7CQkJCQkJCQkJCQkJXAoJKF9yaW5nKS5TaXplID0gKF9zaXplKTsJCQkJCQkJCQkJCVwKfQojZGVmaW5lIFNYR19BRFZBTkNFX0lOREVYKF9pbmRleCwgX3NpemUpICgoX2luZGV4KSA9ICgoX2luZGV4KSArIDEpICYgKChfc2l6ZSkgLSAxKSkKI2RlZmluZSBTWEdfUFJFVklPVVNfSU5ERVgoX2luZGV4LCBfc2l6ZSkgKCgoX2luZGV4KSAtIDEpICYoKF9zaXplKSAtIDEpKQojZGVmaW5lIFNYR19SSU5HX0VNUFRZKF9yaW5nKSAoKF9yaW5nKS0+SGVhZCA9PSAoX3JpbmcpLT5UYWlsKQojZGVmaW5lIFNYR19SSU5HX0ZVTEwoX3JpbmcpICgoKChfcmluZyktPkhlYWQgKyAxKSAmICgoX3JpbmcpLT5TaXplIC0gMSkpID09IChfcmluZyktPlRhaWwpCiNkZWZpbmUgU1hHX1JJTkdfQURWQU5DRV9IRUFEKF9yaW5nKSBTWEdfQURWQU5DRV9JTkRFWCgoX3JpbmcpLT5IZWFkLCAoKF9yaW5nKS0+U2l6ZSkpCiNkZWZpbmUgU1hHX1JJTkdfUkVUUkVBVF9IRUFEKF9yaW5nKSAoKF9yaW5nKS0+SGVhZCA9CQkJCVwKCQkJCQkJCQkJICBTWEdfUFJFVklPVVNfSU5ERVgoKF9yaW5nKS0+SGVhZCwgKF9yaW5nKS0+U2l6ZSkpCiNkZWZpbmUgU1hHX1JJTkdfQURWQU5DRV9UQUlMKF9yaW5nKSB7CQkJCQkJCQlcCglBU1NFUlQoKF9yaW5nKS0+VGFpbCAhPSAoX3JpbmcpLT5IZWFkKTsJCQkJCQkJXAoJU1hHX0FEVkFOQ0VfSU5ERVgoKF9yaW5nKS0+VGFpbCwgKChfcmluZyktPlNpemUpKTsJCQkJXAp9Ci8vIFNldCBjbWQgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHJpbmcgZW50cnksIHNldCB0aGUgc2hhZG93IGNvbnRleHQKLy8gZW50cnkgYW5kIGFkdmFuY2UgdGhlIHJpbmcuCi8vIFRoZSBhcHByb3ByaWF0ZSBsb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBtYWNybwojZGVmaW5lIFNYR19HRVRfQ01EKF9yaW5nLCBfcmluZ2luZm8sIF9jbWQsIF9jb250ZXh0KSB7CQkJCVwKCWlmKFNYR19SSU5HX0ZVTEwoX3JpbmdpbmZvKSkgewkJCQkJCQkJCVwKCQkoX2NtZCkgPSBOVUxMOwkJCQkJCQkJCQkJCVwKCX0gZWxzZSB7CQkJCQkJCQkJCQkJCQlcCgkJKF9jbWQpID0gJihfcmluZyktPkRlc2NyaXB0b3JzWyhfcmluZ2luZm8pLT5IZWFkXTsJCQlcCgkJKF9yaW5naW5mbyktPkNvbnRleHRbKF9yaW5naW5mbyktPkhlYWRdID0gKHZvaWQgKikoX2NvbnRleHQpO1wKCQlTWEdfUklOR19BRFZBTkNFX0hFQUQoX3JpbmdpbmZvKTsJCQkJCQkJXAoJfQkJCQkJCQkJCQkJCQkJCQlcCn0KCi8vIEFib3J0IHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjb21tYW5kIGJ5IHJldHJlYXRpbmcgdGhlIGhlYWQuCi8vIE5PVEUgLSBUaGUgYXBwb3ByaWF0ZSBsb2NrIE1VU1QgTk9UIEJFIERST1BQRUQgYmV0d2VlbiB0aGUgU1hHX0dFVF9DTUQKLy8gYW5kIFNYR19BQk9SVF9DTUQgY2FsbHMuCiNkZWZpbmUgU1hHX0FCT1JUX0NNRChfcmluZ2luZm8pIHsJCQkJCQkJCQlcCglBU1NFUlQoIShTWEdfUklOR19FTVBUWShfcmluZ2luZm8pKSk7CQkJCQkJCVwKCVNYR19SSU5HX1JFVFJFQVRfSEVBRChfcmluZ2luZm8pOwkJCQkJCQkJXAoJKF9yaW5naW5mbyktPkNvbnRleHRbKF9yaW5naW5mbyktPkhlYWRdID0gTlVMTDsJCQkJCVwKfQoKLy8gRm9yIHRoZSBnaXZlbiByaW5nLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0YWlsIGNtZCBhbmQgY29udGV4dCwKLy8gY2xlYXIgdGhlIGNvbnRleHQgYW5kIGFkdmFuY2UgdGhlIHRhaWwKI2RlZmluZSBTWEdfUkVUVVJOX0NNRChfcmluZywgX3JpbmdpbmZvLCBfY21kLCBfY29udGV4dCkgewkJCVwKCShfY21kKSA9ICYoX3JpbmcpLT5EZXNjcmlwdG9yc1soX3JpbmdpbmZvKS0+VGFpbF07CQkJCVwKCShfY29udGV4dCkgPSAoX3JpbmdpbmZvKS0+Q29udGV4dFsoX3JpbmdpbmZvKS0+VGFpbF07ICAgICAgIAlcCgkoX3JpbmdpbmZvKS0+Q29udGV4dFsoX3JpbmdpbmZvKS0+VGFpbF0gPSBOVUxMOwkJCQkJXAoJU1hHX1JJTkdfQURWQU5DRV9UQUlMKF9yaW5naW5mbyk7CQkJCQkJCQlcCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSG9zdCBDb21tYW5kIEJ1ZmZlciAtIGNvbW1hbmRzIHRvIElOSUMgdmlhIHRoZSBDbWQgUmluZ3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogIDMxICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgICAgICAgIDAKICogIC5fX19fX19fX19fX19fX19fX19fLl9fX19fX19fX19fX19fX19fX18uCiAqICB8PC0tLS0tLS0tLS0tLS0tIFNnbCBMb3cgLS0tLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wwCQkweDAwCiAqICB8PC0tLS0tLS0tLS0tLS0tIFNnbCBIaWdoIC0tLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w0CQkweDA0CiAqICB8PC0tLS0tLS0tLS0tLS0gIFNnZSAwIExvdyAgLS0tLS0tLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3w4IAkJMHgwOAogKiAgfDwtLS0tLS0tLS0tLS0tICBTZ2UgMCBIaWdoIC0tLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MTIJCTB4MGMKICogIHw8LS0tLS0tLS0tLS0tICBTZ2UgMCBMZW5ndGggLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDE2CQkweDEwCiAqICB8PC0tLS0tLS0tLS0tIFdpbmRvdyBVcGRhdGUgLS0tLS0tLS0tLS0+fAogKiAgfDwtLS0tLS0tLSBTUCAxc3QgU0dFIG9mZnNldCAtLS0tLS0tLS0tPnwKICogIHxfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198MjAJCTB4MTQKICogIHw8LS0tLS0tLS0tLS0gVG90YWwgTGVuZ3RoIC0tLS0tLS0tLS0tLT58CiAqICB8X19fX19fX19ffF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffDI0CQkweDE4CiAqICB8PC0tLS0tIExDbnQgLS0tLS0tPnw8LS0tLS0gRmxhZ3MgLS0tLS0+fAogKiAgfF9fX19fX19fX3xfX19fX19fX198X19fX19fX19ffF9fX19fX19fX3wyOAkJMHgxYwogKi8KI3ByYWdtYSBwYWNrKHB1c2gsIDEpCnR5cGVkZWYgc3RydWN0IF9TWEdfQ01EIHsKCWRtYV9hZGRyX3QgU2dsOwkJLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBTR0wKCXVuaW9uIHsKCQlzdHJ1Y3QgewoJCQlkbWE2NF9hZGRyX3QgRmlyc3RTZ2VBZGRyZXNzOwkvLyBBZGRyZXNzIG9mIGZpcnN0IFNHRQoJCQl1MzIgRmlyc3RTZ2VMZW5ndGg7CS8vIExlbmd0aCBvZiBmaXJzdCBTR0UKCQkJdW5pb24gewoJCQkJdTMyIFJzdmQxOwkvLyBUT0UgTkEKCQkJCXUzMiBTZ2VPZmZzZXQ7CS8vIFNsb3dwYXRoIC0gMm5kIFNHRSBvZmZzZXQKCQkJCXUzMiBSZXNpZDsJLy8gTURMIGNvbXBsZXRpb24gLSBjbG9iYmVycyB1cGRhdGUKCQkJfTsKCQkJdW5pb24gewoJCQkJdTMyIFRvdGFsTGVuZ3RoOwkvLyBUb3RhbCB0cmFuc2ZlciBsZW5ndGgKCQkJCXUzMiBNc3M7CS8vIExTTyBNU1MKCQkJfTsKCQl9IEJ1ZmZlcjsKCX07Cgl1bmlvbiB7CgkJc3RydWN0IHsKCQkJdW5zaWduZWQgY2hhciBGbGFnczo0OwkvLyBzbG93cGF0aCBmbGFncwoJCQl1bnNpZ25lZCBjaGFyIElwSGw6NDsJLy8gSXAgaGVhZGVyIGxlbmd0aCAoPj4yKQoJCQl1bnNpZ25lZCBjaGFyIE1hY0xlbjsJLy8gTWFjIGhlYWRlciBsZW4KCQl9IENzdW1GbGFnczsKCQlzdHJ1Y3QgewoJCQl1c2hvcnQgRmxhZ3M6NDsJLy8gc2xvd3BhdGggZmxhZ3MKCQkJdXNob3J0IFRjcEhkck9mZjo3OwkvLyBUQ1AKCQkJdXNob3J0IE1hY0xlbjo1OwkvLyBNYWMgaGVhZGVyIGxlbgoJCX0gTHNvRmxhZ3M7CgkJdXNob3J0IEZsYWdzOwkvLyBmbGFncwoJfTsKCXVuaW9uIHsKCQl1c2hvcnQgU2dFbnRyaWVzOwkvLyBTRyBlbnRyeSBjb3VudCBpbmNsdWRpbmcgZmlyc3Qgc2dlCgkJc3RydWN0IHsKCQkJdW5zaWduZWQgY2hhciBTdGF0dXM7CS8vIENvcGllZCBmcm9tIGV2ZW50IHN0YXR1cwoJCQl1bnNpZ25lZCBjaGFyIE5vdFVzZWQ7CgkJfSBTdGF0dXM7Cgl9Owp9IFNYR19DTUQsICpQU1hHX0NNRDsKI3ByYWdtYSBwYWNrKHBvcCkKCiNwcmFnbWEgcGFjayhwdXNoLCAxKQp0eXBlZGVmIHN0cnVjdCBfVkxBTl9IRFIgewoJdXNob3J0IFZsYW5UY2k7Cgl1c2hvcnQgVmxhblRwaWQ7Cn0gVkxBTl9IRFIsICpQVkxBTl9IRFI7CiNwcmFnbWEgcGFjayhwb3ApCgovKgogKiBTbG93cGF0aCBGbGFnczoKICoKICoKICogTFNTIEZsYWdzOgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy4tLS0gVENQIExhcmdlIHNlZ21lbnQgc2VuZAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy4tLS0KICogIDMgICAgICAgICAgICAgICAgICAgMSAgICAgMSAgICAgICAvLy8vCiAqICAxICAgICAgICAgICAgICAgICAgIDUgICAgIDAgICAgICB8fHx8CiAqICAuX19fX19fX19fX19fX19fX19fXy5fX19fX19fX19fX192dnZ2LgogKiAgfCAgICAgICAgICAgICAgICAgICB8TUFDIHwgIFRDUCB8ICAgIHwKICogIHwgICAgICBMQ250ICAgICAgICAgfGhsZW58aGRyb2ZmfEZsZ3N8CiAqICB8X19fX19fX19fX19fX19fX19fX3x8fHx8fHx8fHx8fHxfX19ffAogKgogKgogKiBDaGVja3N1bSBGbGFncwogKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLS0tCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy4tLS0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLi0tLSBDaGVja3N1bSBUQ1AKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLi0tLSBDaGVja3N1bSBJUAogKiAgMyAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIC8vLy8gTm8gYml0cyAtIG5vcm1hbCBzZW5kCiAqICAxICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgNyAgICB8fHx8CiAqICAuX19fX19fX19fX19fX19fX19fXy5fX19fX19fX19fX19fX192dnZ2LgogKiAgfCAgICAgICAgICAgICAgICAgICB8IE9mZmxvYWQgfCBJUCB8ICAgIHwKICogIHwgICAgICBMQ250ICAgICAgICAgfE1BQyBobGVuIHxIbGVufEZsZ3N8CiAqICB8X19fX19fX19fX19fX19fX19fX3xfX19ffF9fX198X19fX3xfX19ffAogKgogKi8KLy8gU2xvd3BhdGggQ01EIGZsYWdzCiNkZWZpbmUgU1hHX1NMT1dDTURfQ1NVTV9JUAkJCTB4MDEJLy8gQ2hlY2tzdW0gSVAKI2RlZmluZSBTWEdfU0xPV0NNRF9DU1VNX1RDUAkJMHgwMgkvLyBDaGVja3N1bSBUQ1AKI2RlZmluZSBTWEdfU0xPV0NNRF9MU08JCQkJMHgwNAkvLyBMYXJnZSBzZWdtZW50IHNlbmQKCnR5cGVkZWYgc3RydWN0IF9TWEdfWE1UX1JJTkcgewoJU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfWE1UX1JJTkdfU0laRV07Cn0gU1hHX1hNVF9SSU5HLCAqUFNYR19YTVRfUklORzsKCnR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX1JJTkcgewoJU1hHX0NNRCBEZXNjcmlwdG9yc1tTWEdfUkNWX1JJTkdfU0laRV07Cn0gU1hHX1JDVl9SSU5HLCAqUFNYR19SQ1ZfUklORzsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2hhcmUgbWVtb3J5IGJ1ZmZlciB0eXBlcyAtIFVzZWQgdG8gaWRlbnRpZnkgYXN5bmNocm9ub3VzCiAqIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp0eXBlZGVmIGVudW0gewoJU1hHX0JVRkZFUl9UWVBFX1JDViwJLy8gUmVjZWl2ZSBidWZmZXIKCVNYR19CVUZGRVJfVFlQRV9TR0wJLy8gU0dMIGJ1ZmZlcgp9IFNYR19CVUZGRVJfVFlQRTsKCi8vIFN0YXRlIGZvciBTWEcgYnVmZmVycwojZGVmaW5lIFNYR19CVUZGRVJfRlJFRQkJMHgwMQojZGVmaW5lIFNYR19CVUZGRVJfQlVTWQkJMHgwMgojZGVmaW5lIFNYR19CVUZGRVJfT05DQVJECTB4MDQKI2RlZmluZSBTWEdfQlVGRkVSX1VQU1RSRUFNCTB4MDgKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUmVjZWl2ZSBkYXRhIGJ1ZmZlcnMKICoKICogUmVjZWl2ZSBkYXRhIGJ1ZmZlcnMgYXJlIGdpdmVuIHRvIHRoZSBTYWhhcmEgY2FyZCAxMjggYXQgYSB0aW1lLgogKiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBmaWxsaW5nIGluIGEgInJlY2VpdmUgZGVzY3JpcHRvciBibG9jayIKICogd2l0aCAxMjggInJlY2VpdmUgZGVzY3JpcHRvcnMiLiAgRWFjaCBkZXNjcmlwdG9yIGNvbnNpc3RzIG9mCiAqIGEgcGh5c2ljYWwgYWRkcmVzcywgd2hpY2ggdGhlIGNhcmQgdXNlcyBhcyB0aGUgYWRkcmVzcyB0bwogKiBETUEgZGF0YSBpbnRvLCBhbmQgYSB2aXJ0dWFsIGFkZHJlc3MsIHdoaWNoIGlzIGdpdmVuIGJhY2sKICogdG8gdGhlIGhvc3QgaW4gdGhlICJIb3N0SGFuZGxlIiBwb3J0aW9uIG9mIGFuIGV2ZW50LgogKiBUaGUgcmVjZWl2ZSBkZXNjcmlwdG9yIGRhdGEgc3RydWN0dXJlIGlzIGRlZmluZWQgYmVsb3cKICogYXMgU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBibG9jawogKiBpcyBkZWZpbmVkIGFzIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSy4KICoKICogVGhpcyByZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sgaXMgZ2l2ZW4gdG8gdGhlIGNhcmQgYnkgZmlsbGluZwogKiBpbiB0aGUgU2dsIGZpZWxkIG9mIGEgU1hHX0NNRCBlbnRyeSBmcm9tIHBBZGFwdC0+UmN2UmluZ3NbMF0KICogd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIGJsb2NrLgogKgogKiBCb3RoIHRoZSByZWNlaXZlIGJ1ZmZlcnMgYW5kIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2tzCiAqIHJlcXVpcmUgYWRkaXRpb25hbCBkYXRhIHN0cnVjdHVyZXMgdG8gbWFpbnRhaW4gdGhlbQogKiBvbiBhIGZyZWUgcXVldWUgYW5kIGNvbnRhaW4gb3RoZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZW0uCiAqIFRob3NlIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBhcyB0aGUgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIKICogYW5kIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgcmVzcGVjdGl2ZWx5LgogKgogKiBTaW5jZSBib3RoIHRoZSByZWNlaXZlIGJ1ZmZlcnMgYW5kIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sKICogbXVzdCBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjYXJkLCBib3RoIG11c3QgYmUgYWxsb2NhdGVkIG91dCBvZgogKiBzaGFyZWQgbWVtb3J5LiAgVG8gZW5zdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgYSBkZXNjcmlwdG9yCiAqIGJsb2NrIGF2YWlsYWJsZSBmb3IgZXZlcnkgMTI4IGJ1ZmZlcnMsIHdlIGFsbG9jYXRlIGFsbCBvZgogKiB0aGVzZSByZXNvdXJjZXMgdG9nZXRoZXIgaW4gYSBzaW5nbGUgYmxvY2suICBUaGlzIGVudGlyZQogKiBibG9jayBpcyBtYW5hZ2VkIGJ5IGEgU1hHX1JDVl9CTE9DS19IRFIsIHdobydzIHNvbGUgcHVycG9zZQogKiBpcyB0byBtYWludGFpbiBhZGRyZXNzIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGVudGlyZSBibG9jawogKiBjYW4gYmUgZnJlZSBsYXRlci4KICoKICogRnVydGhlciBjb21wbGljYXRpbmcgbWF0dGVycyBpcyB0aGUgZmFjdCB0aGF0IHRoZSByZWNlaXZlCiAqIGJ1ZmZlcnMgbXVzdCBiZSB2YXJpYWJsZSBpbiBsZW5ndGggaW4gb3JkZXIgdG8gYWNjb21vZGF0ZQogKiBqdW1ibyBmcmFtZSBjb25maWd1cmF0aW9ucy4gIFdlIGNvbmZpZ3VyZSB0aGUgYnVmZmVyCiAqIGxlbmd0aCBzbyB0aGF0IHRoZSBidWZmZXIgYW5kIGl0J3MgY29ycmVzcG9uZGluZyBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUgogKiBzdHJ1Y3R1cmUgYWRkIHVwIHRvIGFuIGV2ZW4gYm91bmRhcnkuICBUaGVuIHdlIHBsYWNlIHRoZQogKiByZW1haW5pbmcgZGF0YSBzdHJ1Y3R1cmVzIGFmdGVyIDEyOCBvZiB0aGVtIGFzIHNob3duIGluCiAqIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbToKICoKICogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogfCAgICBWYXJpYWJsZSBsZW5ndGggcmVjZWl2ZSBidWZmZXIgIzEgICAgfAogKiB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogfCAgICAgICBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiAjMSAgICAgICAgfAogKiB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198IDw9PSBFdmVuIDJrIG9yIDEwayBib3VuZGFyeQogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICAgICAgICAuLi4gcmVwZWF0IDItMTI4IC4uICAgICAgICAgICAgIHwKICogfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAogKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqIHwgICAgICBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgICAgICAgICAgIHwKICogfCAgQ29udGFpbnMgU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IgKiAxMjggfAogKiB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogfCAgICAgIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgICAgICAgfAogKiB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogfCAgICAgICAgICBTWEdfUkNWX0JMT0NLX0hEUiAgICAgICAgICAgICAgfAogKiB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiAqCiAqIE1lbW9yeSBjb25zdW1wdGlvbjoKICoJICBOb24tanVtYm86CiAqICAgICAgQnVmZmVycyBhbmQgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgPSAyayAqIDEyOCA9IDI1NmsKICogICAgKyBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgPSAyawogKiAgICArIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DS19IRFIgPSB+MzIKICogICAgKyBTWEdfUkNWX0JMT0NLX0hEUiA9IH4zMgogKiAgICA9PiBUb3RhbCA9IH4yNThrL2Jsb2NrCiAqCiAqCSAgSnVtYm86CiAqICAgICAgQnVmZmVycyBhbmQgU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIgPSAxMGsgKiAxMjggPSAxMjgwawogKiAgICArIFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSyA9IDJrCiAqICAgICsgU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiA9IH4zMgogKiAgICArIFNYR19SQ1ZfQkxPQ0tfSERSID0gfjMyCiAqICAgID0+IFRvdGFsID0gfjEyODJrL2Jsb2NrCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgU1hHX1JDVl9EQVRBX0JVRkZFUlMJCQk0MDk2CS8vIEFtb3VudCB0byBnaXZlIHRvIHRoZSBjYXJkCiNkZWZpbmUgU1hHX0lOSVRJQUxfUkNWX0RBVEFfQlVGRkVSUwk4MTkyCS8vIEluaXRpYWwgcG9vbCBvZiBidWZmZXJzCiNkZWZpbmUgU1hHX01JTl9SQ1ZfREFUQV9CVUZGRVJTCQkyMDQ4CS8vIE1pbmltdW0gYW1vdW50IGFuZCB3aGVuIHRvIGdldCBtb3JlCiNkZWZpbmUgU1hHX01BWF9SQ1ZfQkxPQ0tTCQkJCTEyOAkvLyA9IDE2Mzg0IHJlY2VpdmUgYnVmZmVycwoKLy8gUmVjZWl2ZSBidWZmZXIgaGVhZGVyCnR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB7CglkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsJLy8gQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MKCS8vIE5vdGUgLSBETyBOT1QgVVNFIHRoZSBWaXJ0dWFsQWRkcmVzcyBmaWVsZCB0byBsb2NhdGUgZGF0YS4KCS8vIFVzZSB0aGUgc3hnLmg6U1hHX1JFQ0VJVkVfREFUQV9MT0NBVElPTiBtYWNybyBpbnN0ZWFkLgoJdm9pZCAqVmlydHVhbEFkZHJlc3M7CS8vIFN0YXJ0IG9mIGJ1ZmZlcgoJTElTVF9FTlRSWSBGcmVlTGlzdDsJLy8gRnJlZSBxdWV1ZSBvZiBidWZmZXJzCglzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9CVUZGRVJfSERSICpOZXh0OwkvLyBGYXN0cGF0aCBkYXRhIGJ1ZmZlciBxdWV1ZQoJdTMyIFNpemU7CQkvLyBCdWZmZXIgc2l6ZQoJdTMyIEJ5dGVPZmZzZXQ7CQkvLyBTZWUgU1hHX1JFU1RPUkVfTURMX09GRlNFVAoJdW5zaWduZWQgY2hhciBTdGF0ZTsJLy8gU2VlIFNYR19CVUZGRVIgc3RhdGUgYWJvdmUKCXVuc2lnbmVkIGNoYXIgU3RhdHVzOwkvLyBFdmVudCBzdGF0dXMgKHRvIGxvZyBQVVNIKQoJc3RydWN0IHNrX2J1ZmYgKnNrYjsJLy8gRG91YmxlIG1hcHBlZCAobmJsIGFuZCBwa3QpCn0gU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFIsICpQU1hHX1JDVl9EQVRBX0JVRkZFUl9IRFI7CgovLyBTeGdTbG93UmVjZWl2ZSB1c2VzIHRoZSBQQUNLRVQgKHNrYikgY29udGFpbmVkCi8vIGluIHRoZSBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiB3aGVuIGluZGljYXRpbmcgZHVtYi1uaWMgZGF0YQojZGVmaW5lIFN4Z0R1bWJSY3ZQYWNrZXQJICAgICAgICBza2IKCiNkZWZpbmUgU1hHX1JDVl9EQVRBX0hEUl9TSVpFCQkJMjU2CS8vIFNwYWNlIGZvciBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUgojZGVmaW5lIFNYR19SQ1ZfREFUQV9CVUZGRVJfU0laRQkJMjA0OAkvLyBOb24ganVtYm8gPSAyayBpbmNsdWRpbmcgSERSCiNkZWZpbmUgU1hHX1JDVl9KVU1CT19CVUZGRVJfU0laRQkJMTAyNDAJLy8ganVtYm8gPSAxMGsgaW5jbHVkaW5nIEhEUgoKLy8gUmVjZWl2ZSBkYXRhIGRlc2NyaXB0b3IKdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfREFUQV9ERVNDUklQVE9SIHsKCXVuaW9uIHsKCQlzdHJ1Y3Qgc2tfYnVmZiAqVmlydHVhbEFkZHJlc3M7CS8vIEhvc3QgaGFuZGxlCgkJdTY0IEZvcmNlVG84Qnl0ZXM7CS8vIEZvcmNlIHg4NiB0byA4LWJ5dGUgYm91bmRhcnkKCX07CglkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzczsKfSBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUiwgKlBTWEdfUkNWX0RBVEFfREVTQ1JJUFRPUjsKCi8vIFJlY2VpdmUgZGVzY3JpcHRvciBibG9jawojZGVmaW5lIFNYR19SQ1ZfREVTQ1JJUFRPUlNfUEVSX0JMT0NLCQkxMjgKI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfU0laRQkJMjA0OAkvLyBGb3Igc2FuaXR5IGNoZWNrCnR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0sgewoJU1hHX1JDVl9EQVRBX0RFU0NSSVBUT1IgRGVzY3JpcHRvcnNbU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0tdOwp9IFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSywgKlBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0s7CgovLyBSZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sgaGVhZGVyCnR5cGVkZWYgc3RydWN0IF9TWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSIHsKCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiAyayBidWZmZXIKCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOwkvLyAuLmFuZCBpdCdzIHBoeXNpY2FsIGFkZHJlc3MKCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgcXVldWUgb2YgZGVzY3JpcHRvciBibG9ja3MKCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCn0gU1hHX1JDVl9ERVNDUklQVE9SX0JMT0NLX0hEUiwgKlBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSOwoKLy8gUmVjZWl2ZSBibG9jayBoZWFkZXIKdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfQkxPQ0tfSERSIHsKCXZvaWQgKlZpcnR1YWxBZGRyZXNzOwkvLyBTdGFydCBvZiB2aXJ0dWFsIG1lbW9yeQoJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIC4uYW5kIGl0J3MgcGh5c2ljYWwgYWRkcmVzcwoJTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBRdWV1ZSBvZiBhbGwgU1hHX1JDVl9CTE9DS1MKfSBTWEdfUkNWX0JMT0NLX0hEUiwgKlBTWEdfUkNWX0JMT0NLX0hEUjsKCi8vIE1hY3JvcyB0byBkZXRlcm1pbmUgZGF0YSBzdHJ1Y3R1cmUgb2Zmc2V0cyBpbnRvIHJlY2VpdmUgYmxvY2sKI2RlZmluZSBTWEdfUkNWX0JMT0NLX1NJWkUoX0J1ZmZlcnNpemUpIAkJCQkJXAoJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCgkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkgICAgICAgICAgKwkJXAoJIChzaXplb2YoU1hHX1JDVl9CTE9DS19IRFIpKSkKI2RlZmluZSBTWEdfUkNWX0JVRkZFUl9EQVRBX1NJWkUoX0J1ZmZlcnNpemUpCQkJCVwKCSgoX0J1ZmZlcnNpemUpIC0gU1hHX1JDVl9EQVRBX0hEUl9TSVpFKQojZGVmaW5lIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQlcCgkoKF9CdWZmZXJzaXplKSAtIFNYR19SQ1ZfREFUQV9IRFJfU0laRSkKI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfT0ZGU0VUKF9CdWZmZXJzaXplKQkJXAoJKChfQnVmZmVyc2l6ZSkgKiBTWEdfUkNWX0RFU0NSSVBUT1JTX1BFUl9CTE9DSykKI2RlZmluZSBTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJXAoJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpKQojZGVmaW5lIFNYR19SQ1ZfQkxPQ0tfSERSX09GRlNFVChfQnVmZmVyc2l6ZSkJCQkJXAoJKCgoX0J1ZmZlcnNpemUpICogU1hHX1JDVl9ERVNDUklQVE9SU19QRVJfQkxPQ0spICsJCVwKCSAoc2l6ZW9mKFNYR19SQ1ZfREVTQ1JJUFRPUl9CTE9DSykpICAgICAgICAgICAgICArCQlcCgkgKHNpemVvZihTWEdfUkNWX0RFU0NSSVBUT1JfQkxPQ0tfSERSKSkpCgovLyBVc2UgdGhlIG1pbmlwb3J0IHJlc2VydmVkIHBvcnRpb24gb2YgdGhlIE5CTCB0byBsb2NhdGUKLy8gb3VyIFNYR19SQ1ZfREFUQV9CVUZGRVJfSERSIHN0cnVjdHVyZS4KdHlwZWRlZiBzdHJ1Y3QgX1NYR19SQ1ZfTkJMX1JFU0VSVkVEIHsKCVBTWEdfUkNWX0RBVEFfQlVGRkVSX0hEUiBSY3ZEYXRhQnVmZmVySGRyOwoJdm9pZCAqQXZhaWxhYmxlOwp9IFNYR19SQ1ZfTkJMX1JFU0VSVkVELCAqUFNYR19SQ1ZfTkJMX1JFU0VSVkVEOwoKI2RlZmluZSBTWEdfUkNWX05CTF9CVUZGRVJfSERSKF9OQkwpICgoKFBTWEdfUkNWX05CTF9SRVNFUlZFRClORVRfQlVGRkVSX0xJU1RfTUlOSVBPUlRfUkVTRVJWRUQoX05CTCkpLT5SY3ZEYXRhQnVmZmVySGRyKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTY2F0dGVyIGdhdGhlciBsaXN0IGJ1ZmZlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojZGVmaW5lIFNYR19JTklUSUFMX1NHTF9CVUZGRVJTCQk4MTkyCS8vIEluaXRpYWwgcG9vbCBvZiBTR0wgYnVmZmVycwojZGVmaW5lIFNYR19NSU5fU0dMX0JVRkZFUlMJCQkyMDQ4CS8vIE1pbmltdW0gYW1vdW50IGFuZCB3aGVuIHRvIGdldCBtb3JlCiNkZWZpbmUgU1hHX01BWF9TR0xfQlVGRkVSUwkJCTE2Mzg0CS8vIE1heGltdW0gdG8gYWxsb2NhdGUgKG5vdGUgQURBUFQ6dXNob3J0KQoKLy8gU2VsZiBpZGVudGlmeWluZyBzdHJ1Y3R1cmUgdHlwZQp0eXBlZGVmIGVudW0gX1NYR19TR0xfVFlQRSB7CglTWEdfU0dMX0RVTUIsCQkvLyBEdW1iIE5JQyBTR0wKCVNYR19TR0xfU0xPVywJCS8vIFNsb3dwYXRoIHByb3RvY29sIGhlYWRlciAtIHNlZSBiZWxvdwoJU1hHX1NHTF9DSElNTkVZCQkvLyBDaGltbmV5IG9mZmxvYWQgU0dMCn0gU1hHX1NHTF9UWVBFLCBQU1hHX1NHTF9UWVBFOwoKLy8gTm90ZSAtIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBpcyBNaWNyb3NvZnQgc3BlY2lmaWMKLy8KLy8gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIHNoYXJlZCBtZW1vcnkgdG8gYWxsb2NhdGUKLy8gZm9yIHRoZSBTQ0FUVEVSX0dBVEhFUl9MSVNUIHBvcnRpb24gb2YgdGhlIFNYR19TQ0FUVEVSX0dBVEhFUiBkYXRhIHN0cnVjdHVyZS4KLy8gVGhlIGZvbGxvd2luZyBjb25zaWRlcmF0aW9ucyBhcHBseSB3aGVuIHNldHRpbmcgdGhpcyB2YWx1ZToKLy8gLSBGaXJzdCwgdGhlIFNhaGFyYSBjYXJkIGlzIGRlc2lnbmVkIHRvIHJlYWQgdGhlIE1pY3Jvc29mdCBTR0wgc3RydWN0dXJlCi8vICAgICAgIHN0cmFpZ2h0IG91dCBvZiBob3N0IG1lbW9yeS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgU0dMIG11c3QgcmVzaWRlIGluCi8vICAgICAgIHNoYXJlZCBtZW1vcnkuICBJZiB0aGUgbGVuZ3RoIGhlcmUgaXMgc21hbGxlciB0aGFuIHRoZSBTR0wgZm9yIHRoZQovLyAgICAgICBORVRfQlVGRkVSLCB0aGVuIE5ESVMgd2lsbCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlci4gIFRoZSBidWZmZXIKLy8gICAgICAgdGhhdCBORElTIGFsbG9jYXRlcyBpcyBub3QgaW4gc2hhcmVkIG1lbW9yeSwgc28gd2hlbiB0aGlzIGhhcHBlbnMsCi8vICAgICAgIHRoZSBTR0wgd2lsbCBuZWVkIHRvIGJlIGNvcGllZCB0byBhIHNldCBvZiBTWEdfU0NBVFRFUl9HQVRIRVIgYnVmZmVycy4KLy8gICAgICAgSW4gb3RoZXIgd29yZHMuLiB3ZSBkb24ndCB3YW50IHRoaXMgdmFsdWUgdG8gYmUgdG9vIHNtYWxsLgovLyAtIE9uIHRoZSBvdGhlciBoYW5kLi4gd2UncmUgYWxsb2NhdGluZyB1cCB0byAxNmsgb2YgdGhlc2UgdGhpbmdzLiAgSWYKLy8gICAgICAgd2UgbWFrZSB0aGlzIHRvbyBiaWcsIHdlIHN0YXJ0IHRvIGNvbnN1bWUgYSB0b24gb2YgbWVtb3J5Li4KLy8gQXQgdGhlIG1vbWVudCwgSSdtIGdvaW5nIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgU0cgZW50cmllcyB0byAxNTAuCi8vIElmIGVhY2ggZW50cnkgbWFwcyByb3VnaGx5IDRrLCB0aGVuIHRoaXMgc2hvdWxkIGNvdmVyIHJvdWdobHkgNjAwa0IKLy8gTkVUX0JVRkZFUnMuICBGdXJ0aGVybW9yZSwgc2luY2UgZWFjaCBlbnRyeSBpcyAyNCBieXRlcywgdGhlIHRvdGFsCi8vIFNHRSBwb3J0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgY29uc3VtZXMgMzYwMCBieXRlcywgd2hpY2ggc2hvdWxkIGFsbG93Ci8vIHRoZSBlbnRpcmUgU1hHX1NDQVRURVJfR0FUSEVSIHN0cnVjdHVyZSB0byByZXNpZGUgY29tZm9ydGFibHkgd2l0aGluCi8vIGEgNGsgYmxvY2ssIHByb3ZpZGluZyB0aGUgcmVtYWluaW5nIGZpZWxkcyBzdGF5IHVuZGVyIDUwMCBieXRlcy4KLy8KLy8gU28gd2l0aCAxNTAgZW50cmllcywgdGhlIFNYR19TQ0FUVEVSX0dBVEhFUiBzdHJ1Y3R1cmUgYmVjb21lcyByb3VnaGx5Ci8vIDRrLiAgQXQgMTZrIG9mIHRoZW0sIHRoYXQgYW1vdW50cyB0byA2NE0gb2Ygc2hhcmVkIG1lbW9yeS4gIEEgdG9uLCBidXQKLy8gbWFuYWdlYWJsZS4KI2RlZmluZSBTWEdfU0dMX0VOVFJJRVMJCTE1MAoKLy8gVGhlIHVjb2RlIGV4cGVjdHMgYW4gTkRJUyBTR0wgc3RydWN0dXJlIHRoYXQKLy8gaXMgZm9ybWF0dGVkIGZvciBhbiB4NjQgc3lzdGVtLiAgV2hlbiBydW5uaW5nCi8vIG9uIGFuIHg2NCBzeXN0ZW0sIHdlIGNhbiBzaW1wbHkgaGFuZCB0aGUgTkRJUyBTR0wKLy8gdG8gdGhlIGNhcmQgZGlyZWN0bHkuICBGb3IgeDg2IHN5c3RlbXMgd2UgbXVzdCByZWNvbnN0cnVjdAovLyB0aGUgU0dMLiAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiB4NjQKLy8gZm9ybWF0dGVkIFNHTCBlbnRyeQp0eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0UgewoJZG1hNjRfYWRkcl90IEFkZHJlc3M7CS8vIHNhbWUgYXMgd2RtLmgKCXUzMiBMZW5ndGg7CQkvLyBzYW1lIGFzIHdkbS5oCgl1MzIgQ29tcGlsZXJQYWQ7CS8vIFRoZSBjb21waWxlciBwYWRzIHRvIDgtYnl0ZXMKCXU2NCBSZXNlcnZlZDsJCS8vIHUzMiAqIGluIHdkbS5oLiAgRm9yY2UgdG8gOCBieXRlcwp9IFNYR19YNjRfU0dFLCAqUFNYR19YNjRfU0dFOwoKdHlwZWRlZiBzdHJ1Y3QgX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgewoJZG1hNjRfYWRkcl90IEFkZHJlc3M7CS8vIHNhbWUgYXMgd2RtLmgKCXUzMiBMZW5ndGg7CQkvLyBzYW1lIGFzIHdkbS5oCgl1MzIgQ29tcGlsZXJQYWQ7CS8vIFRoZSBjb21waWxlciBwYWRzIHRvIDgtYnl0ZXMKCXU2NCBSZXNlcnZlZDsJCS8vIHUzMiAqIGluIHdkbS5oLiAgRm9yY2UgdG8gOCBieXRlcwp9IFNDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQU0NBVFRFUl9HQVRIRVJfRUxFTUVOVDsKCnR5cGVkZWYgc3RydWN0IF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKCXUzMiBOdW1iZXJPZkVsZW1lbnRzOwoJdTMyICpSZXNlcnZlZDsKCVNDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbXTsKfSBTQ0FUVEVSX0dBVEhFUl9MSVNULCAqUFNDQVRURVJfR0FUSEVSX0xJU1Q7CgovLyBUaGUgY2FyZCBkb2Vzbid0IGNhcmUgYWJvdXQgYW55dGhpbmcgZXhjZXB0IGVsZW1lbnRzLCBzbwovLyB3ZSBjYW4gbGVhdmUgdGhlIHUzMiAqIHJlc2VydmVkIGZpZWxkIGFsb25lIGluIHRoZSBmb2xsb3dpbmcKLy8gU0dMIHN0cnVjdHVyZS4gIEJ1dCByZWRlZmluZSBmcm9tIHdkbS5oOlNDQVRURVJfR0FUSEVSX0xJU1Qgc28KLy8gd2UgY2FuIHNwZWNpZnkgU1hHX1g2NF9TR0UgYW5kIGRlZmluZSBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cwp0eXBlZGVmIHN0cnVjdCBfU1hHX1g2NF9TR0wgewoJdTMyIE51bWJlck9mRWxlbWVudHM7Cgl1MzIgKlJlc2VydmVkOwoJU1hHX1g2NF9TR0UgRWxlbWVudHNbU1hHX1NHTF9FTlRSSUVTXTsKfSBTWEdfWDY0X1NHTCwgKlBTWEdfWDY0X1NHTDsKCnR5cGVkZWYgc3RydWN0IF9TWEdfU0NBVFRFUl9HQVRIRVIgewoJU1hHX1NHTF9UWVBFIFR5cGU7CS8vIEZJUlNUISBEdW1iLW5pYyBvciBvZmZsb2FkCgl2b2lkICphZGFwdGVyOwkJLy8gQmFjayBwb2ludGVyIHRvIGFkYXB0ZXIKCUxJU1RfRU5UUlkgRnJlZUxpc3Q7CS8vIEZyZWUgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcwoJTElTVF9FTlRSWSBBbGxMaXN0OwkvLyBBbGwgU1hHX1NDQVRURVJfR0FUSEVSIGJsb2NrcwoJZG1hX2FkZHJfdCBQaHlzaWNhbEFkZHJlc3M7CS8vIHBoeXNpY2FsIGFkZHJlc3MKCXVuc2lnbmVkIGNoYXIgU3RhdGU7CS8vIFNlZSBTWEdfQlVGRkVSIHN0YXRlIGFib3ZlCgl1bnNpZ25lZCBjaGFyIENtZEluZGV4OwkvLyBDb21tYW5kIHJpbmcgaW5kZXgKCXN0cnVjdCBza19idWZmICpEdW1iUGFja2V0OwkvLyBBc3NvY2lhdGVkIFBhY2tldAoJdTMyIERpcmVjdGlvbjsJCS8vIEZvciBhc3luY2hyb25vdXMgY29tcGxldGlvbnMKCXUzMiBDdXJPZmZzZXQ7CQkvLyBDdXJyZW50IFNHTCBvZmZzZXQKCXUzMiBTZ2xSZWY7CQkvLyBTR0wgcmVmZXJlbmNlIGNvdW50CglWTEFOX0hEUiBWbGFuVGFnOwkvLyBWTEFOIHRhZyB0byBiZSBpbnNlcnRlZCBpbnRvIFNHTAoJUFNDQVRURVJfR0FUSEVSX0xJU1QgcFNnbDsJLy8gU0dMIEFkZHIuIFBvc3NpYmx5ICZTZ2wKCVNYR19YNjRfU0dMIFNnbDsJLy8gU0dMIGhhbmRlZCB0byBjYXJkCn0gU1hHX1NDQVRURVJfR0FUSEVSLCAqUFNYR19TQ0FUVEVSX0dBVEhFUjsKCiNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCiNkZWZpbmUgU1hHX1NHTF9CVUZGRVIoX1N4Z1NnbCkJCSgmX1N4Z1NnbC0+U2dsKQojZGVmaW5lIFNYR19TR0xfQlVGX1NJWkUJCQlzaXplb2YoU1hHX1g2NF9TR0wpCiNlbGlmIGRlZmluZWQoQ09ORklHX1g4NikKLy8gRm9yY2UgTkRJUyB0byBnaXZlIHVzIGl0J3Mgb3duIGJ1ZmZlciBzbyB3ZSBjYW4gcmVmb3JtYXQgdG8gb3VyIG93bgojZGVmaW5lIFNYR19TR0xfQlVGRkVSKF9TeGdTZ2wpCQlOVUxMCiNkZWZpbmUgU1hHX1NHTF9CVUZfU0laRQkJCTAKI2Vsc2UKU3RvcCBDb21waWxhdGlvbjsKI2VuZGlmCg==