Ly8gICB2aW06dHc9MTEwOnRzPTQ6Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZJTEUgICA6CUhDRi5DCioKKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCiogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWw6CTIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKiBPcmlnaW5hbDoJMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCiogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQoqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKiBPcmlnaW5hbDoJMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCiogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQoqCiogQVVUSE9SIDoJTmljbyBWYWxzdGVyCioKKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgoqCiogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCioJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcwoqCioJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCiogU09GVFdBUkUgTElDRU5TRQoqCiogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwoqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCioKKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCiogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKgoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoqCiogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwoqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQoqICAgIGRpc3RyaWJ1dGlvbi4KKgoqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKgoqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCioKKiBEaXNjbGFpbWVyCioKKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQoqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQoqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwoqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAoqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAoqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKiBEQU1BR0UuCioKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiBJbXBsZW1lbnRhdGlvbiBOb3RlcwoqKgoqIC0JYSBsZWFkaW5nIG1hcmtlciBvZiAvLyEgaXMgdXNlZC4gVGhlIHB1cnBvc2Ugb2Ygc3VjaCBhIHNlcXVlbmNlIGlzIHRvIGhlbHAgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdwoqCUFuIGV4YW1wbGUgaXM6CS8vIXJjID0gSENGX1NVQ0NFU1M7CioJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQoqCXByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAoqCWZpcnN0IGdsYW5jZQoqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CioJeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCiogLQlyZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCQkJCS8vIEhDRiBhbmQgTVNGIGNvbW1vbiBpbmNsdWRlIGZpbGUKI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCiNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CgojaWYgISBkZWZpbmVkIG9mZnNldG9mCiNkZWZpbmUgb2Zmc2V0b2YocyxtKSAgICgodW5zaWduZWQgaW50KSYoKChzICopMCktPm0pKQojZW5kaWYgLy8gb2Zmc2V0b2YKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludAkJCWNtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKTsKSENGX1NUQVRJQyBpbnQJCQlpbml0KCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICk7CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCkhDRl9TVEFUSUMgdm9pZAkJCWNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBNICk7CnZvaWQgCQkJCQljYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKdm9pZCAJCQkJCWNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApOwpIQ0ZfU1RBVElDIGludAkJCWNoZWNrX21pYyggSUZCUCBpZmJwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCkhDRl9TVEFUSUMgdm9pZAkJCWNhbGlicmF0ZSggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgaW50CQkJY21kX2NtcGwoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGhjZl8xNgkJZ2V0X2ZpZCggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgdm9pZAkJCWlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKI2lmIEhDRl9ETUEKSENGX1NUQVRJQyBERVNDX1NUUkNUKglnZXRfZnJhbWVfbHN0KElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcpOwojZW5kaWYgLy8gSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsJLy9jaGFyKiwgYnl0ZSBjb3VudCAodXN1YWxseSBldmVuKQojaWYgSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApOwojZW5kaWYgLy8gSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludAkJCXNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApOwojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKc3RhdGljIGludCBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoKSENGX1NUQVRJQyBpbnQJCQlkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKTsKI2lmIChIQ0ZfRU5DQVApICYgSENGX0VOQwpIQ0ZfU1RBVElDIGhjZl84CQloY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKTsKI2VuZGlmIC8vIEhDRl9FTkNBUApIQ0ZfU1RBVElDIGhjZl84CQludWxsX2FkZHJbNF0gPSB7IDAsIDAsIDAsIDAgfTsKI2lmICEgZGVmaW5lZCBJTl9QT1JUX1dPUkQJCQkvL3JlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKZXh0ZXJuIEZJTEUgKmxvZ19maWxlOwoKI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlpbl9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpICkKCnN0YXRpYyBoY2ZfMTYgaW5fcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCApIHsKaGNmXzE2IGkgPSAoaGNmXzE2KV9pbnB3KCBwb3J0ICk7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5SICUyLjJ4ICU0LjR4IiwgKHBvcnQpJjB4RkYsIGkpOwoJfQoJcmV0dXJuIGk7Cn0gLy8gaW5fcG9ydF93b3JkCgojZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCW91dF9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQoKc3RhdGljIHZvaWQgb3V0X3BvcnRfd29yZCggaGNmX2lvIHBvcnQsIGhjZl8xNiB2YWx1ZSApIHsKCV9vdXRwdyggcG9ydCwgdmFsdWUgKTsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcblcgJTIuMDJ4ICU0LjA0eCIsIChwb3J0KSYweEZGLCB2YWx1ZSApOwoJfQp9Cgp2b2lkIElOX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogZHN0LCBpbnQgbikJewoJaW50IGkgPSAwOwoJaGNmXzE2IEZBUiAqIHA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5yZWFkIHN0cmluZ18zMiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDIuMnggdG8gYWRkciAlbHAiLAoJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCk7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQlwID0gKGhjZl8xNiBGQVIgKilkc3Q7CgkJKnArKyA9IChoY2ZfMTYpX2lucHcoIHBydCApOwoJCSpwICAgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpkc3QpOwoJCX0KCQlkc3QrKzsKCX0KfSAvLyBJTl9QT1JUX1NUUklOR18zMgoKdm9pZCBJTl9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBkc3QsIGludCBuKSB7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCgloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopZHN0OwkJCQkJCQkvL3RoaXMgbmVlZHMgbW9yZSBlbGFib3JhdGUgY29kZSBpbiBub24teDg2IHBsYXRmb3JtcwoJaW50IGkgPSAwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QgKTsKCX0KCXdoaWxlICggbi0tICkgewoJCSpwID0oaGNmXzE2KV9pbnB3KCBwcnQpOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWlmICggaSsrICUgMHgxMCApIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiJTA0eCAiLCAqcCk7CgkJCX0gZWxzZSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuJTA0eCAiLCAqcCk7CgkJCX0KCQl9CgkJcCsrOwoJfQp9IC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKCnZvaWQgT1VUX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogc3JjLCBpbnQgbikJewoJaW50IGkgPSAwOwoJaGNmXzE2IEZBUiAqIHA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGKTsKCX0KCXdoaWxlICggbi0tICkgewoJCXAgPSAoaGNmXzE2IEZBUiAqKXNyYzsKCQlfb3V0cHcoIHBydCwgKnArKyApOwoJCV9vdXRwdyggcHJ0LCAqcCAgICk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqc3JjKTsKCQl9CgkJc3JjKys7Cgl9Cn0gLy8gT1VUX1BPUlRfU1RSSU5HXzMyCgp2b2lkIE9VVF9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBzcmMsIGludCBuKQl7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCgloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopc3JjOwkJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKCWludCBpID0gMDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbndyaXRlIHN0cmluZ18xNiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDR4IiwgbiwgbiwgKGhjZl8xNilwcnQpOwoJfQoJd2hpbGUgKCBuLS0gKSB7CgkJKHZvaWQpX291dHB3KCBwcnQsICpwKTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOwoJCQl9IGVsc2UgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOwoJCQl9CgkJfQoJCXArKzsKCX0KfSAvLyBPVVRfUE9SVF9TVFJJTkdfOF8xNgoKI2VuZGlmIC8vIElOX1BPUlRfV09SRAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBIQ0ZfQVNTRVJUCklGQlAgQkFTRUQgYXNzZXJ0X2lmYnAgPSBOVUxMOwkJCS8vdG8gbWFrZSBhc3NlcnRzIGVhc2lseSB3b3JrIHVuZGVyIE1NRCBhbmQgREhGCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgojaWYgSENGX0VOQ0FQCi8qIFNOQVAgaGVhZGVyIHRvIGJlIGluc2VydGVkIGluIEV0aGVybmV0LUlJIGZyYW1lcyAqLwpIQ0ZfU1RBVElDICBoY2ZfOCBCQVNFRCBzbmFwX2hlYWRlcltdID0geyAweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLAkvLzUgYnl0ZXMgc2lnbmF0dXJlICsKCQkJCQkJCQkJCSAgMCB9OwkJCQkJCQkvLzEgYnl0ZSBwcm90b2NvbCBpZGVudGlmaWVyCiNlbmRpZiAvLyBIQ0ZfRU5DQVAKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCkhDRl9TVEFUSUMgaGNmXzggQkFTRUQgbWljX3BhZFs4XSA9IHsgMHg1QSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwkJLy9NSUMgcGFkZGluZyBvZiBtZXNzYWdlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKQ0ZHX0lERU5USVRZX1NUUkNUIEJBU0VEIGNmZ19kcnZfaWRlbnRpdHkgPSB7CglzaXplb2YoY2ZnX2Rydl9pZGVudGl0eSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfSURFTlRJVFksCQkJLy8gKDB4MDgyNikKCU1TRl9DT01QT05FTlRfSUQsCglNU0ZfQ09NUE9ORU5UX1ZBUiwKCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSLAoJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKfSA7CgpDRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0gewoJc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9TVVBfUkFOR0UsCQkJLy8gKDB4MDgyNykKCglDT01QX1JPTEVfU1VQTCwKCUNPTVBfSURfRFVJLAoJe3sJRFVJX0NPTVBBVF9WQVIsCgkJRFVJX0NPTVBBVF9CT1QsCgkJRFVJX0NPTVBBVF9UT1AKCX19Cn0gOwoKc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwJCS8vICgweDA4MjgpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfUFJJLAoJewoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfUFJJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKCSB7CTMsCQkJCQkJCQkJLy92YXJfcmVjWzJdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0KCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwJCS8vICgweDA4MjkpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfU1RBLAoJewojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8xCgkgewkxLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8xX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMQojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8yCgkgewkyLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMgovLyBGb3IgTmF0aXZlX1VTQiAoTm90IHVzZWQhKQojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8zCgkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMwovLyBXYXJwCiNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzQKCSB7CTQsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzQKCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSwJCS8vICgweDA4MkEpCglDT01QX1JPTEVfQUNULAoJQ09NUF9JRF9IU0ksCgl7CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzAJCQkJCS8vIENvbnRyb2xsZWQgZGVwbG95bWVudAoJIHsJMCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0hTSV9WQVJfMAoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzMgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl80CQkJCQkvLyBIZXJtZXMtSUkgYWxsIHR5cGVzCgkgewk0LAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0sCiNlbHNlCgkgeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzUJCQkJCS8vIFdBUlAgSGVybWVzLTIuNQoJIHsJNSwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzUKCX0KfSA7CgoKQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0gewoJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECglDRkdfRFJWX0FDVF9SQU5HRVNfQVBGLAkJLy8gKDB4MDgyQikKCglDT01QX1JPTEVfQUNULAoJQ09NUF9JRF9BUEYsCgl7CiNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzEJCQkJLy8oRmFrZSkgSGVybWVzLUkKCSB7CTEsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMQojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yCQkJCS8vSGVybWVzLUlJCgkgewkyLAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0sCiNlbHNlCgkgeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8yCiNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzMJCQkJCQkvLyBOYXRpdmVfVVNCCgkgewkzLAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMwojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl80CQkJCQkJLy8gV0FSUCBIZXJtZXMgMi41Cgkgewk0LAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzQKCX0KfSA7CiNkZWZpbmUgSENGX1ZFUlNJT04gIFRFWFQoICJIQ0YkUmV2aXNpb246IDEuMTAgJCIgKQoKc3RhdGljIHN0cnVjdCAvKkNGR19IQ0ZfT1BUX1NUUkNUKi8gewoJaGNmXzE2CWxlbjsJCQkJCS8vbGVuZ3RoIG9mIGNmZ19oY2Zfb3B0IHN0cnVjdAoJaGNmXzE2CXR5cDsJCQkJCS8vdHlwZSAweDA4MkMKCWhjZl8xNgkgdjA7CQkJCQkJLy9vZmZzZXQgSENGX1ZFUlNJT04KCWhjZl8xNgkgdjE7CQkJCQkJLy8gTVNGX0NPTVBPTkVOVF9JRAoJaGNmXzE2CSB2MjsJCQkJCQkvLyBIQ0ZfQUxJR04KCWhjZl8xNgkgdjM7CQkJCQkJLy8gSENGX0FTU0VSVAoJaGNmXzE2CSB2NDsJCQkJCQkvLyBIQ0ZfQklHX0VORElBTgoJaGNmXzE2CSB2NTsJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYgKi8KCWhjZl8xNgkgdjY7CQkJCQkJLy8gSENGX0RNQQoJaGNmXzE2CSB2NzsJCQkJCQkvLyBIQ0ZfRU5DQVAKCWhjZl8xNgkgdjg7CQkJCQkJLy8gSENGX0VYVAoJaGNmXzE2CSB2OTsJCQkJCQkvLyBIQ0ZfSU5UX09OCgloY2ZfMTYJdjEwOwkJCQkJCS8vIEhDRl9JTwoJaGNmXzE2CXYxMTsJCQkJCQkvLyBIQ0ZfTEVHQUNZCgloY2ZfMTYJdjEyOwkJCQkJCS8vIEhDRl9NQVhfTFRWCgloY2ZfMTYJdjEzOwkJCQkJCS8vIEhDRl9QUk9UX1RJTUUKCWhjZl8xNgl2MTQ7CQkJCQkJLy8gSENGX1NMRUVQCgloY2ZfMTYJdjE1OwkJCQkJCS8vIEhDRl9UQUxMSUVTCgloY2ZfMTYJdjE2OwkJCQkJCS8vIEhDRl9UWVBFCgloY2ZfMTYJdjE3OwkJCQkJCS8vIEhDRl9OSUNfVEFMX0NOVAoJaGNmXzE2CXYxODsJCQkJCQkvLyBIQ0ZfSENGX1RBTF9DTlQKCWhjZl8xNgl2MTk7CQkJCQkJLy8gb2Zmc2V0IHRhbGxpZXMKCVRDSEFSCXZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKfSBCQVNFRCBjZmdfaGNmX29wdCA9IHsKCXNpemVvZihjZmdfaGNmX29wdCkvc2l6ZW9mKGhjZl8xNikgLTEsCglDRkdfSENGX09QVCwJCQkJLy8gKDB4MDgyQykKCSggc2l6ZW9mKGNmZ19oY2Zfb3B0KSAtIHNpemVvZihIQ0ZfVkVSU0lPTikgLSA0ICkvc2l6ZW9mKGhjZl8xNiksCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKCU1TRl9DT01QT05FTlRfSUQsCiNlbHNlCgkwLAojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoJSENGX0FMSUdOLAoJSENGX0FTU0VSVCwKCUhDRl9CSUdfRU5ESUFOLAoJMCwJCQkJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYqLywKCUhDRl9ETUEsCglIQ0ZfRU5DQVAsCglIQ0ZfRVhULAoJSENGX0lOVF9PTiwKCUhDRl9JTywKCUhDRl9MRUdBQ1ksCglIQ0ZfTUFYX0xUViwKCUhDRl9QUk9UX1RJTUUsCglIQ0ZfU0xFRVAsCglIQ0ZfVEFMTElFUywKCUhDRl9UWVBFLAojaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKCUhDRl9OSUNfVEFMX0NOVCwKCUhDRl9IQ0ZfVEFMX0NOVCwKCW9mZnNldG9mKElGQl9TVFJDVCwgSUZCX1RhbGx5TGVuICksCiNlbHNlCgkwLCAwLCAwLAojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCglIQ0ZfVkVSU0lPTgp9OyAvLyBjZmdfaGNmX29wdAojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoKI2lmIGRlZmluZWQgSENGX1RBTExJRVNfRVhUUkEKCXJlcGxhY2VkIGJ5IEhDRl9FWFRfVEFMTElFU19GVyA7CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19FWFRSQQoKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCB8fCAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgaGNmXzE2KiBCQVNFRCB4eHh4WyBdID0gewojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoJJmNmZ19udWxsLmxlbiwJCQkJCQkJLy9DRkdfTlVMTAkJCQkJCTB4MDgyMAojZW5kaWYgLy8gSENGX0VYVF9NQgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECgkmY2ZnX2Rydl9pZGVudGl0eS5sZW4sCQkJCQkvL0NGR19EUlZfSURFTlRJVFkgICAgICAgICAgICAgIDB4MDgyNgoJJmNmZ19kcnZfc3VwX3JhbmdlLmxlbiwJCQkJCS8vQ0ZHX0RSVl9TVVBfUkFOR0UgICAgICAgICAgICAgMHgwODI3CgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfUFJJICAgICAgICAweDA4MjgKCSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19TVEEJCTB4MDgyOQoJJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2kubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQkJMHgwODJBCgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZi5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfQVBGCQkweDA4MkIKCSZjZmdfaGNmX29wdC5sZW4sCQkJCQkJLy9DRkdfSENGX09QVAkJCQkJMHgwODJDCglOVUxMLAkJCQkJCQkJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgoJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoJTlVMTAkJCQkJCQkJCS8vZW5kc2VudGluZWwKICB9OwojZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVAkoQVJSQVlfU0laRSh4eHh4KSAtIDMpCgojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqIFQgTyBQICAgTCBFIFYgRSBMICAgSCBDIEYgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQoqLlBVUlBPU0UJCUNoYW5nZXMgdGhlIHJ1bi10aW1lIENhcmQgYmVoYXZpb3IuCioJCQkJUGVyZm9ybXMgTWlzY2VsbGFudW91cyBhY3Rpb25zLgoqCiouQVJHVU1FTlRTCioJaWZicAkJCQkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYWN0aW9uCQkJCQludW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgY2hhbmdlCioJIC0gSENGX0FDVF9DQ1hfT0ZGCQlkaXNhYmxlIENLSVAKKgkgLSBIQ0ZfQUNUX0NDWF9PTgkJZW5hYmxlIENLSVAKKgkgLSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTgllbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKKgkgLSBIQ0ZfQUNUX0lOVF9PRkYJCWRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKKgkgLSBIQ0ZfQUNUX0lOVF9PTgkJY29tcGVuc2F0ZSAxIEhDRl9BQ1RfSU5UX09GRiwgZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGlmIGJhbGFuY2UgcmVhY2hlZAoqCSAtIEhDRl9BQ1RfUFJTX1NDQU4JCUhlcm1lcyBQcm9iZSBSZXNwb25zIFNjYW4gKEYxMDIpIGNvbW1hbmQKKgkgLSBIQ0ZfQUNUX1JYX0FDSwkJYWNrbm93bGVkZ2Ugbm9uLURNQSByZWNlaXZlciB0byBIZXJtZXMKKgkgLSBIQ0ZfQUNUX1NDQU4JCQlIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQoqCSAtIEhDRl9BQ1RfU0xFRVAJCUREUyBTbGVlcCByZXF1ZXN0CioJIC0gSENGX0FDVF9UQUxMSUVTCQlIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjb21tYW5kCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MJCQkJYWxsIChpbmNsdWRpbmcgaW52YWxpZCkKKglIQ0ZfSU5UX1BFTkRJTkcJCQlIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCioJSENGX0VSUl9OT19OSUMJCQlIQ0ZfQUNUX0lOVF9PRkYsIE5JQyBwcmVzZW5jZSBjaGVjayBmYWlscwoqCiouQ09ORElUSU9OUwoqIEV4Y2VwdCBmb3IgaGNmX2FjdGlvbiB3aXRoIEhDRl9BQ1RfSU5UX0ZPUkNFX09OIG9yIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIgb3IgaGNmX2Nvbm5lY3Qgd2l0aCBhbiBJL08KKiBhZGRyZXNzIChpLmUuIG5vdCBIQ0ZfRElTQ09OTkVDVCksIGFsbCBoY2YtZnVuY3Rpb24gY2FsbHMgTVVTVCBiZSBwcmVjZWRlZCBieSBhIGNhbGwgb2YgaGNmX2FjdGlvbiB3aXRoCiogSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlci4KKiBOb3RlIHRoYXQgaGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gTklDIGludGVycnVwdCBkaXNhYmxlZCBtb2RlLCBpLmUuIGFzIGlmIGhjZl9hY3Rpb24oIEhDRl9BQ1RfSU5UX09GRiApCiogd2FzIGNhbGxlZC4KKgoqLkRFU0NSSVBUSU9OCiogaGNmX2FjdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1vZGUgY2hhbmdpbmcgYWN0aW9uLWNvZGUgcGFpcnMgdGhhdCBhcmUgYW50b255bXMKKgkgLSBIQ0ZfQUNUX0NDWF9PRkYgLyBIQ0ZfQUNUX0NDWF9PTgoqCSAtIEhDRl9BQ1RfSU5UX1tGT1JDRV9dT04gLyBIQ0ZfQUNUX0lOVF9PRkYKKgoqIEFkZGl0aW9uYWxseSBoY2ZfYWN0aW9uIGNhbiBzdGFydCB0aGUgZm9sbG93aW5nIGFjdGlvbnMgaW4gdGhlIE5JQzoKKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCioJIC0gSENGX0FDVF9SWF9BQ0sKKgkgLSBIQ0ZfQUNUX1NDQU4KKgkgLSBIQ0ZfQUNUX1NMRUVQCioJIC0gSENGX0FDVF9UQUxMSUVTCioKKiBvIEhDRl9BQ1RfSU5UX09GRjogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIERpc2FibGVkLgoqIFRoaXMgY29tbWFuZCwgYW5kIHRoZSBhc3NvY2lhdGVkIFtGb3JjZV0gRW5hYmxlIE5JQyBpbnRlcnJ1cHRzIGNvbW1hbmQsIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0lOVF9PTgoqIGNvbXBpbGUgdGltZSBvcHRpb24gaXMgbm90IHNldCBhdCAweDAwMDAuCioKKiBvIEhDRl9BQ1RfSU5UX09OOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKiBFbmFibGUgTklDIEludGVycnVwdHMsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCioKKiBvIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOiBGb3JjZSBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCiogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQsIHJlZ2FyZGxlc3Mgb2ZmIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KKgoqIFRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIG9mIGludGVycnVwdHMgYXJlIGFudG9ueW1zLgoqIFRoZXNlIGFjdGlvbnMgbXVzdCBiZSBiYWxhbmNlZC4KKiBGb3IgZWFjaCAiZGlzYWJsZSBpbnRlcnJ1cHRzIiB0aGVyZSBtdXN0IGJlIGEgbWF0Y2hpbmcgImVuYWJsZSBpbnRlcnJ1cHRzIi4KKiBUaGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdyB3aXRob3V0IGludGVydmVuaW5nIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgoqIG90aGVyIHdvcmRzLCB0aGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBuZXN0ZWQuCiogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyBkaXNhYmxlZCBhdCB0aGUgZmlyc3QgY2FsbCB3aXRoIEhDRl9BQ1RfSU5UX09GRi4KKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIHJlLWVuYWJsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHdpdGggSENGX0FDVF9JTlRfT04gbWF0Y2hlcyB0aGUKKiBudW1iZXIgb2YgY2FsbHMgd2l0aCBJTlRfT0ZGLgoqCiogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBtb3JlIEVuYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscyB0aGFuIERpc2FibGUgTklDIEludGVycnVwdHMgY2FsbHMuCiogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyBpbml0aWFsbHkgKGkuZS4gYWZ0ZXIgaGNmX2Nvbm5lY3QpIGRpc2FibGVkLgoqIEFuIE1TRiBiYXNlZCBvbiBhIGludGVycnVwdCBzdHJhdGVneSBtdXN0IGNhbGwgaGNmX2FjdGlvbiB3aXRoIElOVF9PTiBpbiBpdHMgaW5pdGlhbGl6YXRpb24gbG9naWMuCioKKiEJVGhlIElOVF9PRkYvSU5UX09OIGhvdXNla2VlcGluZyBpcyBpbml0aWFsaXplZCBhdCAweDAwMDAgYnkgaGNmX2Nvbm5lY3QsIGNhdXNpbmcgdGhlIGludGVycnVwdCBnZW5lcmF0aW9uCioJbWVjaGFuaXNtIHRvIGJlIGRpc2FibGVkIGF0IGZpcnN0LiBUaGlzIHN1aXRzIE1TRiBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIHBvbGxpbmcgc3RyYXRlZ3kuCioKKiBvIEhDRl9BQ1RfQ0NYX09GRiAvIEhDRl9BQ1RfQ0NYX09OCiohISBUaGlzIGNhbiB1c2Ugc29tZSBtb3JlIGV4cGxhbmF0aW9uOz8KKiBEaXNhYmxlcyBhbmQgRW5hYmxlcyBzdXBwb3J0IGluIHRoZSBIQ0YgcnVudGltZSBjb2RlIGZvciB0aGUgQ0NYIGZlYXR1cmUuIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgYWN0aW9uCiogY29kZXMgaXMgdXNlZCwgdGhlIGVmZmVjdHMgb2YgdGhlIHByZWNlZGluZyB1c2UgY2Vhc2UuCioKKiBvIEhDRl9BQ1RfU0xFRVA6IEluaXRpYXRlcyB0aGUgRGlzY29ubmVjdGVkIERlZXBTbGVlcCBwcm9jZXNzCiogVGhpcyBjb21tYW5kIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBIQ0ZfRERTIGNvbXBpbGUgdGltZSBvcHRpb24gaXMgc2V0LiBJdCB0cmlnZ2VycyB0aGUgRi9XIHRvIHN0YXJ0IHRoZQoqIHNsZWVwIGhhbmRzaGFraW5nLiBSZWdhcmRsZXNzIHdoZXRoZXIgdGhlIEhvc3QgaW5pdGlhdGVzIGEgRGlzY29ubmVjdGVkIERlZXBTbGVlcCAoRERTKSBvciB0aGUgRi9XIGluaXRpYXRlcwoqIGEgQ29ubmVjdGVkIERlZXBTbGVlcCAoQ0RTKSwgdGhlIEhvc3QtRi9XIHNsZWVwIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGlzCiogZW5hYmxlZCAoYnkgbWVhbnMgb2YgdGhlIGJhbGFuY2luZyBIQ0ZfQUNUX0lOVF9PTiksIGkuZS4gYXQgdGhhdCBtb21lbnQgdGhlIEYvVyByZWFsbHkgZ29lcyBpbnRvIHNsZWVwIG1vZGUuCiogVGhlIEYvVyBpcyB3b2tlbnVwIGJ5IHRoZSBIQ0Ygd2hlbiB0aGUgTklDIEludGVycnVwdHMgbW9kZSBhcmUgZGlzYWJsZWQsIGkuZS4gYXQgdGhlIGZpcnN0IEhDRl9BQ1RfSU5UX09GRgoqIGFmdGVyIGdvaW5nIGludG8gc2xlZXAuCioKKiBUaGUgZm9sbG93aW5nIE1pc2NlbGxhbnVvdXMgYWN0aW9ucyBhcmUgZGVmaW5lZDoKKgoqIG8gSENGX0FDVF9SWF9BQ0s6IFJlY2VpdmVyIEFja25vd2xlZGdlbWVudCAobm9uLURNQSwgbm9uLVVTQiBtb2RlIG9ubHkpCiogQWNraW5nIHRoZSByZWNlaXZlciwgZnJlZXMgdGhlIE5JQyBtZW1vcnkgdXNlZCB0byBob2xkIHRoZSBSeCBmcmFtZSBhbmQgYWxsb3dzIHRoZSBGL1cgdG8KKiByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmV4dCBSeCBmcmFtZS4KKiBJZiB0aGUgTVNGIGRvZXMgbm90IG5lZWQgYWNjZXNzIChhbnkgbG9uZ2VyKSB0byB0aGUgY3VycmVudCBmcmFtZSwgZS5nLiBiZWNhdXNlIGl0IGlzIHJlamVjdGVkIGJhc2VkIG9uIHRoZQoqIGxvb2sgYWhlYWQgb3IgY29waWVkIHRvIGFub3RoZXIgYnVmZmVyLCB0aGUgcmVjZWl2ZXIgbWF5IGJlIGFja2VkLiBBY2tpbmcgZWFybGllciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlCiogcG90ZW50aWFsIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UuCiogSWYgdGhlIE1TRiBkb2VzIG5vdCBleHBsaXRseSBhY2sgdGUgcmVjZWl2ZXIsIHRoZSBhY2tpbmcgaXMgZG9uZSBpbXBsaWNpdGx5IGlmOgoqIC0gdGhlIHJlY2VpdmVkIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2sgYWhlYWQgYnVmZmVyLCBieSB0aGUgaGNmX3NlcnZpY2VfbmljIGNhbGwgdGhhdCByZXBvcnRlZCB0aGUgUnggZnJhbWUKKiAtIGlmIG5vdCBpbiB0aGUgYWJvdmUgc3RlcCwgYnkgaGNmX3Jjdl9tc2cgKGFzc3VtaW5nIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCkKKiAtIGlmIG5laXRoZXIgb2YgdGhlIGFib3ZlIGltcGxpY2l0IGFja3Mgbm9yIGFuIGV4cGxpY2l0IGFjayBieSB0aGUgTVNGLCBieSB0aGUgZmlyc3QgaGNmX3NlcnZpY2VfbmljIGFmdGVyCioJdGhlIGhjZl9zZXJ2aWNlX25pYyB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZS4KKiBOb3RlOiBJZiBhbiBSeCBmcmFtZSBpcyBhbHJlYWR5IGFja2VkLCBhbiBleHBsaWNpdCBBQ0sgYnkgdGhlIE1TRiBhY3RzIGFzIGEgTm9PcGVyYXRpb24uCioKKiBvIEhDRl9BQ1RfVEFMTElFUzogSW5xdWlyZSBUYWxsaWVzIGNvbW1hbmQKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCiogVGhlIElucXVpcmUgVGFsbGllcyBjb21tYW5kIHJlcXVlc3RzIHRoZSBGL1cgdG8gcHJvdmlkZSBpdHMgY3VycmVudCBzZXQgb2YgdGFsbGllcy4KKiBTZWUgYWxzbyBoY2ZfZ2V0X2luZm8gd2l0aCBDRkdfVEFMTElFUyBhcyBwYXJhbWV0ZXIuCioKKiBvIEhDRl9BQ1RfUFJTX1NDQU46IElucXVpcmUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCiogVGhlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCiogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgoqCiogbyBIQ0ZfQUNUX1NDQU46IElucXVpcmUgU2NhbiBjb21tYW5kCiogVGhpcyBjb21tYW5kIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBISUkgRi9XIChpLmUuIHByZS1XQVJQKSBhbmQgaXQgaXMgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgoqIFRoZSBJbnF1aXJlIFNjYW4gY29tbWFuZCBzdGFydHMgYSBzY2FuIHNlcXVlbmNlLgoqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgoqIC0gYW4gaW52YWxpZCBjb2RlIGlzIHNwZWNpZmllZCBpbiBwYXJhbWV0ZXIgYWN0aW9uLgoqIC0gSENGX0FDVF9JTlRfT04gY29tbWFuZHMgb3V0bnVtYmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYgY29tbWFuZHMuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKKgltdWx0aS10aHJlYWRpbmcKKgoqIC0gU2luY2UgdGhlIEhDRiBkb2VzIG5vdCBtYWludGFpbiBzdGF0dXMgaW5mb3JtYXRpb24gcmVsYXRpdmUgdG8gdGhlIEYvVyBlbmFibGVkIHN0YXRlLCBpdCBpcyBub3QgYXNzZXJ0ZWQKKgl3aGV0aGVyIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBvciBIQ0ZfQUNUX1RBTExJRVMgYXJlIG9ubHkgdXNlZCB3aGlsZSBGL1cgaXMgZW5hYmxlZC4KKgoqLkRJQUdSQU0KKiAwOiBUaGUgYXNzZXJ0IGVtYmVkZGVkIGluIEhDRkxPR0VOVFJZIGNoZWNrcyBhZ2FpbnN0IHJlLWVudHJhbmN5LiBSZS1lbnRyYW5jeSBjb3VsZCBiZSBjYXVzZWQgYnkgYSBNU0YgbG9naWMKKglhdCB0YXNrLWxldmVsIGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IHNoaWVsZGluZyB3aXRoIEhDRl9BQ1RfT04vX09GRi4gSG93ZXZlciB0aGUgSENGX0FDVF9JTlRfT0ZGCioJYWN0aW9uIGl0c2VsZiBjYW4gcGVyIGRlZmluaXRpb24gbm90IGJlIHByb3RlY3RlZCB0aGlzIHdheS4gQmFzZWQgb24gY29kZSBpbnNwZWN0aW9uLCBpdCBjYW4gYmUgY29uY2x1ZGVkLAoqCXRoYXQgdGhlcmUgaXMgbm8gcmUtZW50cmFuY3kgUFJPQkxFTSBpbiB0aGlzIHBhcnRpY3VsYXIgZmxvdy4gSXQgZG9lcyBub3Qgc2VlbSB3b3J0aCB0aGUgdHJvdWJsZSB0bwoqCWV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uIChhbHRob3VnaCB0aGVyZSB3YXMgYSByZXBvcnQgb2YgYW4gTVNGIHdoaWNoIHJhbiBpbnRvIHRoaXMgYXNzZXJ0LgoqIDI6SUZCX0ludE9mZkNudCBpcyB1c2VkIHRvIGJhbGFuY2UgdGhlIElOVF9PRkYgYW5kIElOVF9PTiBjYWxscy4gIERpc2FibGluZyBvZiB0aGUgaW50ZXJydXB0cyBpcyBhY2hpZXZlZCBieQoqCXdyaXRpbmcgYSB6ZXJvIHRvIHRoZSBIZXJtZXMgSW50RW4gcmVnaXN0ZXIuICBJbiBhIHNoYXJlZCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQgKGUuZy4gdGhlIG1pbmktUENJIE5ESVMKKglkcml2ZXIpIGl0IGlzIGNvbnNpZGVyZWQgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGUgc3RhdHVzIEhDRl9JTlRfUEVORElORyBpZiBhbmQgb25seSBpZiwgdGhlIGN1cnJlbnQKKglpbnZvY2F0aW9uIG9mIGhjZl9zZXJ2aWNlX25pYyBpcyAoYXBwYXJlbnRseSkgY2FsbGVkIGluIHRoZSBJU1Igd2hlbiB0aGUgSVNSIHdhcyBhY3RpdmF0ZWQgYXMgcmVzdWx0IG9mIGEKKgljaGFuZ2UgaW4gSFJFR19FVl9TVEFUIG1hdGNoaW5nIGEgYml0IGluIEhSRUdfSU5UX0VOLCBpLmUuIG5vdCBpZiBpbnZva2VkIGFzIHJlc3VsdCBvZiBhbm90aGVyIGRldmljZQoqCWdlbmVyYXRpbmcgYW4gaW50ZXJydXB0IG9uIHRoZSBzaGFyZWQgaW50ZXJydXB0IGxpbmUuCioJTm90ZSAxOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gYWR2ZXJzZSBjb25kaXRpb25zIG9uIGNlcnRhaW4gcGxhdGZvcm1zIHRoZSB3cml0aW5nIG9mCioJSFJFR19JTlRfRU4gY2FuIGFwcGFyZW50bHkgZmFpbCwgdGhlcmVmb3IgaXQgaXMgcGFyYW1vdW50IHRoYXQgSFJFR19JTlRfRU4gaXMgd3JpdHRlbiBhZ2FpbiB3aXRoIDAgZm9yCioJZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBIQ0ZfQUNUX0lOVF9PRkYuCioJTm90ZSAyOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gSC9XICYgUy9XIGFyY2hpdGVjdHVyZXMgdGhpcyBsb2dpYyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcwoqCW5vIE5JQyBhdCBhbGwuIFRvIGNhdGVyIGZvciB0aGlzLCB0aGUgdmFsdWUgb2YgSFJFR19JTlRfRU4gaXMgdmFsaWRhdGVkLiBJZiB0aGUgdW51c2VkIGJpdCAweDAxMDAgaXMgc2V0LAoqCWl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgbm8gTklDLgoqCU5vdGUgMzogRHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLCBzb21lIHZlcnNpb25zIG9mIHRoZSBGL1cgcmVzZXQgSFJFR19TV18wLCBoZW5jZSBjaGVja2luZyB0aGlzCioJcmVnaXN0ZXIgZm9yIEhDRl9NQUdJQyAodGhlIGNsYXNzaWNhbCBOSUMgcHJlc2VuY2UgdGVzdCkgd2hlbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2FsbGVkIGR1ZSB0byBhbm90aGVyCioJY2FyZCBpbnRlcnJ1cHRpbmcgdmlhIGEgc2hhcmVkIElSUSBkdXJpbmcgYSBkb3dubG9hZCwgZmFpbHMuCio0OglUaGUgY29uc3RydWN0aW9uICJpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQtLSA9PSAwICkiIGlzIG9wdGltYWwgKGluIHRoZSBzZW5zZSBvZiBzaG9ydGVzdC9xdWlja2VzdAoqCXBhdGggaW4gZXJyb3IgZnJlZSBmbG93cykgYnV0IE5PVCBmYWlsIHNhZmUgaW4gY2FzZSBvZiB0b28gbWFueSBJTlRfT04gaW52b2NhdGlvbnMgY29tcGFyZWQgdG8gSU5UX09GRikuCioJRW5hYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkgd3JpdGluZyB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLgoqCSAtIElmIHRoZSBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlLCB0aGUgaW50ZXJydXB0cyBzdGF5IGRpc2FibGVkLgoqCSAtIFVuZGVyICJub3JtYWwiIGNvbmRpdGlvbnMsIHRoZSBIQ0YgaXMgb25seSBpbnRlcmVzdGVkIGluIEluZm8gRXZlbnRzLCBSeCBFdmVudHMgYW5kIE5vdGlmeSBFdmVudHMuCioJIC0gV2hlbiB0aGUgSENGIGlzIG91dCBvZiBUeC9Ob3RpZnkgcmVzb3VyY2VzLCB0aGUgSENGIGlzIGFsc28gaW50ZXJlc3RlZCBpbiBBbGxvYyBFdmVudHMuCioJIC0gdmlhIEhDRl9FWFQsIHRoZSBNU0YgcHJvZ3JhbW1lciBjYW4gYWxzbyByZXF1ZXN0IEhSRUdfRVZfVElDSyBhbmQvb3IgSFJFR19FVl9UWF9FWEMgaW50ZXJydXB0cy4KKglGb3IgRE1BIG9wZXJhdGlvbiwgdGhlIERNQSBoYXJkd2FyZSBoYW5kbGVzIHRoZSBhbGxvYyBldmVudHMuIFRoZSBETUEgZW5naW5lIHdpbGwgZ2VuZXJhdGUgYSAnVHhEbWFEb25lJwoqCWV2ZW50IGFzIHNvb24gYXMgaXQgaGFzIHB1bXBlZCBhIGZyYW1lIGZyb20gaG9zdCByYW0gaW50byBOSUMtUkFNIChub3RlIHRoYXQgdGhlIGZyYW1lIGRvZXMgbm90IGhhdmUgdG8gYmUKKgl0cmFuc21pdHRlZCB0aGVuKSwgYW5kIGEgJ1J4RG1hRG9uZScgZXZlbnQgYXMgc29vbiBhcyBhIHJlY2VpdmVkIGZyYW1lIGhhcyBiZWVuIHB1bXBlZCBmcm9tIE5JQy1SQU0gaW50bwoqCWhvc3QgcmFtLiAgTm90ZSB0aGF0IHRoZSAnYWxsb2MnIGV2ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnQtbWFzaywgYmVjYXVzZSB0aGUgRE1BIGVuZ2luZSB3aWxsCioJcmVhY3QgdG8gYW5kIGFja25vd2xlZGdlIHRoaXMgZXZlbnQuCio2OglhY2sgdGhlICJvbGQiIFJ4LWV2ZW50LiBTZWUgIlJ4IEJ1ZmZlciBmcmVlIHN0cmF0ZWd5IiBpbiBoY2Zfc2VydmljZV9uaWMgYWJvdmUgZm9yIG1vcmUgZXhwbGFuYXRpb24uCioJSUZCX1J4RklEIGFuZCBJRkJfUnhMZW4gbXVzdCBiZSBjbGVhcmVkIHRvIGJyaW5nIGJvdGggdGhlIGludGVybmFsIEhDRiBob3VzZSBrZWVwaW5nIGFuZCB0aGUgaW5mb3JtYXRpb24KKglzdXBwbGllZCB0byB0aGUgTVNGIGluIHRoZSBzdGF0ZSAibm8gZnJhbWUgcmVjZWl2ZWQiLgoqODoJVGhlIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBhbmQgSENGX0FDVF9UQUxMSUVTIGFjdGl2aXR5IGFyZSBtZXJnZWQgYnkgImNsZXZlciIgYWxnZWJyYWljCioJbWFuaXB1bGF0aW9ucyBvZiB0aGUgUklELXZhbHVlcyBhbmQgYWN0aW9uIGNvZGVzLCBzbyBmb3JlZ29pbmcgcm9idXN0bmVzcyBhZ2FpbnN0IG1pZ3JhdGlvbiBwcm9ibGVtcyBmb3IKKgllYXNlIG9mIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kCioJSENGX0FDVF9UQUxMSUVTIGV0YyBhcmUgY2hlY2tlZCBieSB0aGUgIiNpZiIgc3RhdGVtZW50cyBqdXN0IHByaW9yIHRvIHRoZSBib2R5IG9mIHRoaXMgcm91dGluZSwgcmVzdWx0aW5nCioJaW46IGVyciAibWFpbnRlbmFuY2UiIGR1cmluZyBjb21waWxhdGlvbiBpZiB0aGUgYXNzdW1wdGlvbnMgYXJlIG5vIGxvbmdlciBtZXQuIFRoZSB3cml0aW5nIG9mIEhSRUdfUEFSQU1fMQoqCXdpdGggMHgzRkZGIGluIGNhc2Ugb2YgYW4gUFJTIHNjYW4sIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgbGFjayBvZiBzcGVjaWZpY2F0aW9uLCBoZW5jZSBkaWZmZXJlbnQKKglpbXBsZW1lbnRhdGlvbiBpbiBGL1cgYW5kIEhvc3QuCioJV2hlbiB0aGVyZSBpcyBubyBOSUMgUkFNIGF2YWlsYWJsZSwgc29tZSB2ZXJzaW9ucyBvZiB0aGUgSGVybWVzIEYvVyBkbyByZXBvcnQgMHg3RjAwIGFzIGVycm9yIGluIHRoZQoqCVJlc3VsdCBmaWVsZCBvZiB0aGUgU3RhdHVzIHJlZ2lzdGVyIGFuZCBzb21lIEYvVyB2ZXJzaW9ucyBkb24ndC4gVG8gbWFzayB0aGlzIGRpZmZlcmVuY2UgdG8gdGhlIE1TRiBhbGwKKglyZXR1cm4gY29kZXMgb2YgdGhlIEhlcm1lcyBhcmUgaWdub3JlZCAoImJlc3QiIGFuZCAibW9zdCBzaW1wbGUiIHNvbHV0aW9uIHRvIHRoZXNlIHR5cGVzIG9mIGFuYWxvbWllcyB3aXRoCioJYW4gYWNjZXB0YWJsZSBsb3NzIGR1ZSB0byBpZ25vcmluZyBhbGwgZXJyb3Igc2l0dWF0aW9ucyBhcyB3ZWxsKS4KKglUaGUgIk5vIGlucXVpcmUgc3BhY2UiIGlzIHJlcG9ydGVkIHZpYSB0aGUgSGVybWVzIHRhbGxpZXMuCiozMDogZG8gbm90IEhDRkFTU0VSVCggcmMsIHJjICkgc2luY2UgcmMgPT0gSENGX0lOVF9QRU5ESU5HIGlzIG5vIGVycm9yCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAojaWYgQ0ZHX1NDQU4gIT0gQ0ZHX1RBTExJRVMgLSBIQ0ZfQUNUX1RBTExJRVMgKyBIQ0ZfQUNUX1NDQU4KZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcwojZW5kaWYKI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKI2lmIENGR19QUlNfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfUFJTX1NDQU4KZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcwojZW5kaWYKaW50CmhjZl9hY3Rpb24oIElGQlAgaWZicCwgaGNmXzE2IGFjdGlvbiApCnsKaW50CXJjID0gSENGX1NVQ0NFU1M7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQojaWYgSENGX0lOVF9PTgoJSENGTE9HRU5UUlkoIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiA/IEhDRl9UUkFDRV9BQ1RJT05fS0xVREdFIDogSENGX1RSQUNFX0FDVElPTiwgYWN0aW9uICkJCQkJCQkJCQkJCQkJCS8qIDAgKi8KI2lmIChIQ0ZfU0xFRVApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9PRkYsCgkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkKI2Vsc2UKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGFjdGlvbiApCiNlbmRpZiAvLyBIQ0ZfU0xFRVAKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkYgfHwKCQkJICAgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04sICBhY3Rpb24gKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250IDw9IDE2IHx8IGlmYnAtPklGQl9JbnRPZmZDbnQgPj0gMHhGRkZFLAoJCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApCS8vbmVzdGluZyBtb3JlIHRoYW4gMTYgZGVlcCBzZWVtcyB1bnJlYXNvbmFibGUKI2VuZGlmIC8vIEhDRl9JTlRfT04KCglzd2l0Y2ggKGFjdGlvbikgewojaWYgSENGX0lOVF9PTgpoY2ZfMTYJaTsKCSAgY2FzZSBIQ0ZfQUNUX0lOVF9PRkY6CQkJCQkJLy8gRGlzYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgojaWYgSENGX1NMRUVQCgkJaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSApIHsJLy8gV2FrZVVwIHRlc3QJOz90aWUgdGhpcyB0byB0aGUgIm5ldyIgc3VwZXItTGlua1N0YXQKCQkJaWZicC0+SUZCX0ludE9mZkNudCsrOwkJCQkJCS8vIHJlc3RvcmUgY29udmVudGlvbmFsIEkvRgoJCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0CgkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQgdG8gY291bnRlcmFjdCB0aGUgY2xlYXJpbmcgYnkgRi9XCgkJCS8vIDgwMCB1cyBsYXRlbmN5IGJlZm9yZSBGVyBzd2l0Y2hlcyB0byBoaWdoIHBvd2VyCgkJCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgovL09PUgkJaWYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRFNfT09SICkgeyAvLyBPdXRPZlJhbmdlCi8vCQkJCXByaW50ayggIjw1PkFDVF9JTlRfT0ZGOiBEZWVwc2xlZXAgcGhhc2UgdGVybWluYXRlZCwgZW5hYmxlIGFuZCBnbyB0byBBd2FpdENvbm5lY3Rpb25cbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKLy8JCQkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0VOQUJMRSApOwovLwkJCX0KLy8JCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCAmPSB+KCBDRkdfTElOS19TVEFUX0RTX0lSIHwgQ0ZHX0xJTktfU1RBVF9EU19PT1IpOwkvL2NsZWFyIElSL09PUiBzdGF0ZQoJCX0KI2VuZGlmIC8vIEhDRl9TTEVFUAovKjIqLwlpZmJwLT5JRkJfSW50T2ZmQ250Kys7Ci8vISAgICAgcmMgPSAwOwoJCWkgPSBJUFcoIEhSRUdfSU5UX0VOICk7CgkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwoJCWlmICggaSAmIDB4MTAwMCApIHsKCQkJcmMgPSBIQ0ZfRVJSX05PX05JQzsKCQl9IGVsc2UgewoJCQlpZiAoIGkgJiBJUFcoIEhSRUdfRVZfU1RBVCApICkgewoJCQkJcmMgPSBIQ0ZfSU5UX1BFTkRJTkc7CgkJCX0KCQl9CgkJYnJlYWs7CgoJICBjYXNlIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOgkJCQkvLyBFbmZvcmNlIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgoJCWlmYnAtPklGQl9JbnRPZmZDbnQgPSAwOwoJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfSU5UX09OCgoJICBjYXNlIEhDRl9BQ1RfSU5UX09OOgkJCQkJCS8vIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgovKjQqLwlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQtLSA9PSAwICYmIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICkgewoJCQkJCQkJCQkJCQkvL2RldGVybWluZSBJbnRlcnJ1cHQgRXZlbnQgbWFzawojaWYgSENGX0RNQQoJCQlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKCQkJCWkgPSBIUkVHX0VWX0lORk8gfCBIUkVHX0VWX1JETUFEIHwgSFJFR19FVl9URE1BRCB8IEhSRUdfRVZfVFhfRVhUOwkvL21hc2sgd2hlbiBETUEgYWN0aXZlCgkJCX0gZWxzZQojZW5kaWYgLy8gSENGX0RNQQoJCQl7CgkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SWCB8IEhSRUdfRVZfVFhfRVhUOwkJCQkJCS8vbWFzayB3aGVuIERNQSBub3QgYWN0aXZlCgkJCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKCQkJCQlpIHw9IEhSRUdfRVZfQUxMT0M7CQkJCQkJCQkJCQkJLy9tYXNrIHdoZW4gbm8gVHhGSUQgYXZhaWxhYmxlCgkJCQl9CgkJCX0KI2lmIEhDRl9TTEVFUAoJCQlpZiAoICggSVBXKEhSRUdfRVZfU1RBVCkgJiAoIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApICkgPT0gSFJFR19FVl9TTEVFUF9SRVEgKSB7CgkJCQkvLyBmaXJtd2FyZSBpbmRpY2F0ZXMgaXQgd291bGQgbGlrZSB0byBnbyBpbnRvIHNsZWVwIG1vZHVzCgkJCQkvLyBvbmx5IGFja25vd2xlZGdlIHRoaXMgcmVxdWVzdCBpZiBubyBvdGhlciBldmVudHMgdGhhdCBjYW4gY2F1c2UgYW4gaW50ZXJydXB0IGFyZSBwZW5kaW5nCgkJCQlpZmJwLT5JRkJfSW50T2ZmQ250LS07CQkJLy9iZWNvbWVzIDB4RkZGRQogICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfVElDSyApOwoJCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX1RJQ0sgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgKTsKCQkJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfU0xFRVAKCQkJewogICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfU0xFRVBfUkVRICk7CgkJCX0KCQl9CgkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfSU5UX09OCgojaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCgkgIGNhc2UgSENGX0FDVF9TTEVFUDoJCQkJCQkvLyBERFMgU2xlZXAgcmVxdWVzdAoJCWhjZl9jbnRsKCBpZmJwLCBIQ0ZfQ05UTF9ESVNBQkxFICk7CgkJY21kX2V4ZSggaWZicCwgSENNRF9TTEVFUCwgMCApOwoJCWJyZWFrOwovLyAJICBjYXNlIEhDRl9BQ1RfV0FLRVVQOgkJCQkJCS8vIEREUyBXYWtldXAgcmVxdWVzdAovLyAJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUsIGlmYnAtPklGQl9JbnRPZmZDbnQgKQovLyAJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsJCQkJCS8vIHJlc3RvcmUgY29udmVudGlvbmFsIEkvRgovLyAJCU9QVyggSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsKLy8gCQlNU0ZfV0FJVCg4MDApOwkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgovLyAJCXJjID0gaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9JTlRfT0ZGICk7CS8qYm9ndXMsIElGQl9JbnRPZmZDbnQgPT0gMHhGRkZGLCBzbyBpZiB5b3UgY2FyZWZ1bGx5IGxvb2sKLy8gCQkJCQkJCQkJCQkJCSAqYXQgdGhlICNpZiBIQ0ZfRERTIHN0YXRlbWVudHMsIEhDRl9BQ1RfSU5UX09GRiBpcyBlbXB0eQovLyAJCQkJCQkJCQkJCQkJICpmb3IgRERTLiAiTXVjaCIgYmV0dGVyIHdvdWxkIGJlIHRvIG1lcmdlIHRoZSBmbG93cyBmb3IKLy8gCQkJCQkJCQkJCQkJCSAqRERTIGFuZCBERUVQX1NMRUVQCi8vIAkJCQkJCQkJCQkJCQkgKi8KLy8gCQlicmVhazsKI2VuZGlmIC8vIEhDRl9ERFMKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkgIGNhc2UgSENGX0FDVF9DQ1hfT046CQkJCQkJLy8gZW5hYmxlIENLSVAKCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PRkY6CQkJCQkJLy8gZGlzYWJsZSBDS0lQCgkJaWZicC0+SUZCX0NLSVBTdGF0ID0gYWN0aW9uOwoJCWJyZWFrOwojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgoJICBjYXNlIEhDRl9BQ1RfUlhfQUNLOgkJCQkJCS8vUmVjZWl2ZXIgQUNLCi8qNiovCWlmICggaWZicC0+SUZCX1J4RklEICkgewoJCQlEQVdBX0FDSyggSFJFR19FVl9SWCApOwoJCX0KCQlpZmJwLT5JRkJfUnhGSUQgPSBpZmJwLT5JRkJfUnhMZW4gPSAwOwoJCWJyZWFrOwoKLyo4Ki8gY2FzZQlIQ0ZfQUNUX1BSU19TQ0FOOgkJCQkJLy8gSGVybWVzIFBSUyBTY2FuIChGMTAyKQoJCU9QVyggSFJFR19QQVJBTV8xLCAweDNGRkYgKTsKCQkJLy9GYWxsIHRocm91Z2ggaW4gSENGX0FDVF9UQUxMSUVTCgkgIGNhc2UgSENGX0FDVF9UQUxMSUVTOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAoJICBjYXNlIEhDRl9BQ1RfU0NBTjoJCQkJCQkvLyBIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKQojZW5kaWYgLy8gSENGX1RZUEVfSElJNQoJCS8qISEgdGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZCBIQ0ZfQUNUX1RBTExJRVMgZXRjCgkJICogICBhcmUgY2hlY2tlZCBieSAjaWYgc3RhdGVtZW50cyBqdXN0IHByaW9yIHRvIHRoaXMgcm91dGluZSByZXN1bHRpbmcgaW46IGVyciAibWFpbnRlbmFuY2UiCSovCgkJY21kX2V4ZSggaWZicCwgSENNRF9JTlFVSVJFLCBhY3Rpb24gLSBIQ0ZfQUNUX1RBTExJRVMgKyBDRkdfVEFMTElFUyApOwoJCWJyZWFrOwoKCSAgZGVmYXVsdDoKCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgYWN0aW9uICkKCQlicmVhazsKCX0KCS8vISBkbyBub3QgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCQkJLyogMzAqLwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0FDVElPTiApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2FjdGlvbgojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKKi5QVVJQT1NFCQlDb25uZWN0IG9yIGRpc2Nvbm5lY3QgYSBzcGVjaWZpYyBwb3J0IHRvIGEgc3BlY2lmaWMgbmV0d29yay4KKiEhICA7Pz8/Pz8/Pz8/Pz8/Pz8/PyBjb250aW51ZSBuZWVkcyBtb3JlIGV4cGxhbmF0aW9uCioJCQkJcmVjb3ZlcnMgYnkgbWVhbnMgb2YgImNvbnRpbnVlIiB3aGVuIHRoZSBjb25uZWN0IHByb2Nlc3MgaW4gQ0NYIG1vZGUgZmFpbHMKKgkJCQlFbmFibGVzIG9yIGRpc2FibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBOSUMuCioJCQkJQWN0aXZhdGVzIHN0YXRpYyBOSUMgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBwb3J0IGF0IGNvbm5lY3QuCioJCQkJQWN0aXZhdGVzIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMgYXQgZW5hYmxlLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJY21kCQkJMHgwMDFGOglIZXJtZXMgY29tbWFuZCAoZGlzYWJsZSwgZW5hYmxlLCBjb25uZWN0LCBkaXNjb25uZWN0LCBjb250aW51ZSkKKgkJCQkJSENGX0NOVExfRU5BQkxFCQlFbmFibGUKKgkJCQkJSENGX0NOVExfRElTQUJMRSAgICBEaXNhYmxlCioJCQkJCUhDRl9DTlRMX0NPTlRJTlVFCUNvbnRpbnVlCioJCQkJCUhDRl9DTlRMX0NPTk5FQ1QgICAgQ29ubmVjdAoqCQkJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUIERpc2Nvbm5lY3QKKgkJCQkweDAxMDA6IGNvbW1hbmQgcXVhbGlmaWVyIChjb250aW51ZSkKKgkJCQkJSENNRF9SRVRSWQkJCXJldHJ5IGZsYWcKKgkJCQkweDA3MDA6ICBwb3J0IG51bWJlciAoY29ubmVjdC9kaXNjb25uZWN0KQoqCQkJCQlIQ0ZfUE9SVF8wICAgICAgICAgIE1BQyBQb3J0IDAKKgkJCQkJSENGX1BPUlRfMSAgICAgICAgICBNQUMgUG9ydCAxCioJCQkJCUhDRl9QT1JUXzIgICAgICAgICAgTUFDIFBvcnQgMgoqCQkJCQlIQ0ZfUE9SVF8zICAgICAgICAgIE1BQyBQb3J0IDMKKgkJCQkJSENGX1BPUlRfNCAgICAgICAgICBNQUMgUG9ydCA0CioJCQkJCUhDRl9QT1JUXzUgICAgICAgICAgTUFDIFBvcnQgNQoqCQkJCQlIQ0ZfUE9SVF82ICAgICAgICAgIE1BQyBQb3J0IDYKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwoqISEJdmlhIGNtZF9leGUKKglIQ0ZfRVJSX05PX05JQwoqCUhDRl9FUlJfREVGVU5DVF8uLi4KKglIQ0ZfRVJSX1RJTUVfT1VUCioKKi5ERVNDUklQVElPTgoqIFRoZSBwYXJhbWV0ZXIgY21kIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YmZpZWxkcy4KKiBUaGUgYWN0dWFsIHZhbHVlIGZvciBjbWQgaXMgY3JlYXRlZCBieSBsb2dpY2FsIG9yLWluZyB0aGUgYXBwcm9wcmlhdGUgbW5lbW9uaWNzIGZvciB0aGUgc3ViZmllbGRzLgoqIFRoZSBmaWVsZCAweDAwMUYgY29udGFpbnMgdGhlIGNvbW1hbmQgY29kZQoqICAtIEhDRl9DTlRMX0VOQUJMRQoqICAtIEhDRl9DTlRMX0RJU0FCTEUKKiAgLSBIQ0ZfQ05UTF9DT05ORUNUCiogIC0gSENGX0NOVExfRElTQ09OTkVDVAoqICAtIEhDRl9DTlRMX0NPTlRJTlVFCioKKiBGb3IgSENGX0NOVExfQ09OVElOVUUsIHRoZSBmaWVsZCAweDAxMDAgY29udGFpbnMgdGhlIHJldHJ5IGZsYWcgSENNRF9SRVRSWS4KKiBGb3IgSENGX0NOVExfQ09OTkVDVCBhbmQgSENGX0NOVExfRElTQ09OTkVDVCwgdGhlIGZpZWxkIDB4MDcwMCBjb250YWlucyB0aGUgcG9ydCBudW1iZXIgYXMgSENGX1BPUlRfIy4KKiBGb3IgU3RhdGlvbiBhcyB3ZWxsIGFzIEFjY2Vzc1BvaW50IEYvVywgTUFDIFBvcnQgMCBpcyB0aGUgIm5vcm1hbCIgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoqIEZvciBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDEgdGhyb3VnaCA2IGNvbnRyb2wgdGhlIFdEUyBsaW5rcy4KKgoqIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBuYW1lcyBIQ0ZfQ05UTF9ESVNBQkxFIGFuZCBIQ0ZfQ05UTF9FTkFCTEUsIGhjZl9jbnRsIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgTklDCiogSW50ZXJydXB0cyBtb2RlLgoqCiogVGhlIENvbm5lY3QgaXMgdXNlZCBieSB0aGUgTVNGIHRvIGJyaW5nIGEgcGFydGljdWxhciBwb3J0IGluIGFuIGluYWN0aXZlIHN0YXRlIGFzIGZhciBhcyBkYXRhIHRyYW5zbWlzc2lvbgoqIGFuZCByZWNlcHRpb24gYXJlIGNvbmNlcm5lZC4KKiBXaGVuIGEgcGFydGljdWxhciBwb3J0IGlzIGRpc2Nvbm5lY3RlZDoKKiAtIHRoZSBGL1cgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCiogLSB0aGUgRi9XIGlnbm9yZXMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgoqIC0gYWxsIGZyYW1lcyAoUmVjZWl2ZSBhcyB3ZWxsIGFzIHBlbmRpbmcgVHJhbnNtaXQpIGZvciB0aGF0IHBvcnQgb24gdGhlIE5JQyBhcmUgZGlzY2FyZGVkLgoqCiogV2hlbiB0aGUgTklDIGlzIGRpc2FibGVkLCBhYm92ZSBsaXN0IGFwcGxpZXMgdG8gYWxsIHBvcnRzLCBpLmUuIHRoZSByZXN1bHQgaXMgbGlrZSBhbGwgcG9ydHMgYXJlCiogZGlzY29ubmVjdGVkLgoqCiogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBjb25uZWN0ZWQ6CiogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwb3J0LgoqIC0gZW5hYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KKiAtIGFjY2VwdHMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgoqCiogRW5hYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMuCioJVGhlIEYvVyBvbmx5IHVwZGF0ZXMgaXRzIHN0YXRpYyBjb25maWd1cmF0aW9uIGF0IGEgdHJhbnNpdGlvbiBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQgb3IgZnJvbQoqCWRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQuCioJSW4gb3JkZXIgdG8gZW5mb3JjZSB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24sIHRoZSBNU0YgbXVzdCBhc3N1cmUgdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZS4KKglEdWUgdG8gc3VjaCBhIGRpc2FibGUvZW5hYmxlIG9yIGRpc2Nvbm5lY3QvY29ubmVjdCBzZXF1ZW5jZSwgUngvVHggZnJhbWVzIG1heSBiZSBsb3N0LCBpbiBvdGhlciB3b3JkcywKKgljb25maWd1cmF0aW9uIG1heSBpbXBhY3QgY29tbXVuaWNhdGlvbi4KKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBlbmFibGVkLgoqIE5vdGUgdGhhdCB0aGUgRW5hYmxlIEZ1bmN0aW9uIGJ5IGl0c2VsZiBvbmx5IGVuYWJsZXMgZGF0YSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgaXQKKiBkb2VzIG5vdCBlbmFibGUgdGhlIEludGVycnVwdCBHZW5lcmF0aW9uIG1lY2hhbmlzbS4gVGhpcyBpcyBkb25lIGJ5IGhjZl9hY3Rpb24uCioKKiBEaXNhYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKiEhICA7Pz8/Pz9pcyB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCByZWFsbHkgdHJ1ZQoqIC0gaXQgYWN0cyBhcyBhIGRpc2Nvbm5lY3Qgb24gYWxsIHBvcnRzLgoqIC0gVGhlIERNQSBFbmdpbmUgKGlmIGFwcGxpY2FibGUpIGlzIGRpc2FibGVkLgoqCiogRm9yIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kIG9uIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3R4L3J4X2dldCBzZWUgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zLgoqCiogQWx0aG91Z2ggdGhlIEVuYWJsZS9EaXNhYmxlIGFuZCBDb25uZWN0L0Rpc2Nvbm5lY3QgYXJlIGFudG9ueW1zLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGVpciBzZXF1ZW5jaW5nLAoqIGluIG90aGVyIHdvcmRzLCB0aGV5IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gYXJiaXRyYXJ5IHNlcXVlbmNlIHdpdGhvdXQgYmVpbmcgcGFpcmVkIG9yIGJhbGFuY2VkLgoqIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCwgdGhlIGVmZmVjdHMgb2YgdGhlIHByZWNlZGluZyBjYWxscyBjZWFzZS4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZC4KKiAtIEEgY29tbWFuZCBvdGhlciB0aGFuIENvbnRpbnVlLCBFbmFibGUsIERpc2FibGUsIENvbm5lY3Qgb3IgRGlzY29ubmVjdCBpcyBnaXZlbi4KKiAtIEFuIGludmFsaWQgY29tYmluYXRpb24gb2YgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbiBvciBhIGJpdCBvdXRzaWRlIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4uCiogLSBhbnkgcmV0dXJuIGNvZGUgYmVzaWRlcyBIQ0ZfU1VDQ0VTUy4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgYSBoY2ZfZnVuY3Rpb24gd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKKgltdWx0aS10aHJlYWRpbmcKKgoqLkRJQUdSQU0KKgloY2ZfY250bCB0YWtlcyBzdWNjZXNzaXZlbHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgoqMjoJSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlIFByaW1hcnkgb3IgU3RhdGlvbiBTdXBwbGllciBpbiB0aGUgSGVybWVzLAoqCWhjZl9jbnRsKCkgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIEhDRl9FUlJfTk9fTklDOz8gYXMgc3RhdHVzLgoqODoJd2hlbiB0aGUgcG9ydCBpcyBkaXNhYmxlZCwgdGhlIERNQSBlbmdpbmUgbmVlZHMgdG8gYmUgZGUtYWN0aXZhdGVkLCBzbyB0aGUgaG9zdCBjYW4gc2FmZWx5IHJlY2xhaW0gdHgKKglwYWNrZXRzIGZyb20gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4uCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKewppbnQJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9GVzsKI2lmIEhDRl9BU1NFUlQKewlpbnQgeCA9IGNtZCAmIEhDTURfQ01EX0NPREU7CglpZiAoIHggPT0gSENGX0NOVExfQ09OVElOVUUgKSB4ICY9IH5IQ01EX1JFVFJZOwoJZWxzZSBpZiAoICh4ID09IEhDTURfRElTQUJMRSB8fCB4ID09IEhDTURfRU5BQkxFKSAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgKSB7CgkJeCAmPSB+SEZTX1RYX0NOVExfUE9SVDsKCX0KCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8CgkJCSAgIHg9PUhDRl9DTlRMX0NPTk5FQ1QgfHwgeD09SENGX0NOVExfRElTQ09OTkVDVCwgY21kICkKfQojZW5kaWYgLy8gSENGX0FTU0VSVAovLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCi8vIAlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBjbWQgKQovLyAjZW5kaWYgLy8gSENGX0REUwoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTlRMLCBjbWQgKQoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsJCQkJCQkJCQkJCQkJCQkJIC8qMiovCi8qNiovCXJjID0gY21kX2V4ZSggaWZicCwgY21kLCAwICk7CiNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7CQkJCS8vc3RhcnQgMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KQojZW5kaWYgLy8gSENGX0REUwoJfQojaWYgSENGX0RNQQoJLy8hcmxhdiA6IG5vdGUgdGhhdCB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkLCByZWdhcmRsZXNzIG9mIHRoZSBERUZVTkNUIGJpdCBpbiBJRkJfQ2FyZFN0YXQuCgkvLyBUaGUgcmVhc29uIGJlaGluZCB0aGlzIGlzIHRoYXQgdGhlIE1TRiBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIGl0cyBETUEgcmVzb3VyY2VzIGJhY2sgZnJvbSB0aGUgSENGLAoJLy8gZXZlbiBpZiB0aGUgaGFyZHdhcmUgaXMgZGlzZnVuY3Rpb25hbC4gUHJhY3RpY2FsIGV4YW1wbGUgdW5kZXIgV2luZG93cyA6IHN1cnByaXNlIHJlbW92YWwuCglpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKCQloY2ZfaW8gaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2U7CgkJREVTQ19TVFJDVCAqcDsKCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9ESVNBQkxFIHx8IGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CgkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfRE1BX0NUUkwpLCBETUFfQ1RSTFNUQVRfUkVTRVQpOwkJCQkJCS8qOCovCgkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5ETUFfRU5BQkxFRDsKCQl9CgkJaWYgKCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgewoJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX0dPKTsKCQkJLyogOz8gYnkgcmV3cml0aW5nIGhjZl9kbWFfcnhfcHV0IHlvdSBjYW4gcHJvYmFibHkganVzdCBjYWxsIGhjZl9kbWFfcnhfcHV0KCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKQoJCQkgKiBhcyBhZGRpdGlvbmFsIGJlbmVmaWNpYXJ5IHNpZGUgZWZmZWN0LCB0aGUgU09QIGFuZCBFT1AgYml0cyB3aWxsIGFsc28gYmUgY2xlYXJlZAoJCQkgKi8KCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gRE1BX0VOQUJMRUQ7CgkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKQoJCQkvLyBtYWtlIHRoZSBlbnRpcmUgcnggZGVzY3JpcHRvciBjaGFpbiBETUEtb3duZWQsIHNvIHRoZSBETUEgZW5naW5lIGNhbiAocmUtKXVzZSBpdC4KCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKCQkJaWYgKHAgIT0gTlVMTCkgeyAgIC8vOz8gVGhpbmsgdGhpcyBvdmVyIGFnYWluIGluIHRoZSBsaWdodCBvZiB0aGUgbmV3IGNoYWluaW5nIHN0cmF0ZWd5CgkJCQlpZiAoIDEgKSAJeyAvL2JlZ2luIGFsdGVybmF0aXZlCgkJCQkJSENGQVNTRVJUKCBOVF9BU1NFUlQsIE5FVkVSX1RFU1RFRCApCgkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLCBETUFfUlggKTsKCQkJCQlpZiAoIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXSApIHsKCQkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLT5uZXh0X2Rlc2NfYWRkciwgRE1BX1JYICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl3aGlsZSAoIHAgKSB7CgkJCQkJCS8vcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOwoJCQkJCQlwLT5CVUZfQ05UIHw9IERFU0NfRE1BX09XTkVEOwoJCQkJCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7CgkJCQkJfQoJCQkJCS8vIGEgcnggY2hhaW4gaXMgYXZhaWxhYmxlIHNvIGhhbmQgaXQgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQoJCQkJCXAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF07CgkJCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19SWERNQV9QVFIzMiksIHAtPmRlc2NfcGh5c19hZGRyKTsKCQkJCX0gIC8vZW5kIGFsdGVybmF0aXZlCgkJCX0KCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRE1BCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ05UTCApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2NudGwKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCiouUFVSUE9TRQkJR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgoqCQkJCUluaXRpYWxpemVzIENhcmQgYW5kIEhDRiBob3VzZWtlZXBpbmcuCioKKi5BUkdVTUVOVFMKKglpZmJwCQkobmVhcikgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJaW9fYmFzZQkJbm9uLVVTQjogSS9PIEJhc2UgYWRkcmVzcyBvZiB0aGUgTklDIChjb25uZWN0KQoqCQkJCW5vbi1VU0I6IEhDRl9ESVNDT05ORUNUCioJCQkJVVNCOgkgSENGX0NPTk5FQ1QsIEhDRl9ESVNDT05ORUNUCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKglIQ0ZfRVJSX0lOQ09NUF9GVwoqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCiohIQlIQ0ZfRVJSX05PX05JQyByZWFsbHkgcmV0dXJuZWQgOz8KKglIQ0ZfRVJSX05PX05JQwoqCUhDRl9FUlJfVElNRV9PVVQKKgoqCU1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6CioJSUZCX0lPQmFzZQkJCQllbnRyeSBwYXJhbWV0ZXIgaW9fYmFzZQoqCUlGQl9JT1JhbmdlCQkJCUhSRUdfSU9fUkFOR0UgKDB4NDAvMHg4MCkKKglJRkJfVmVyc2lvbgkJCQl2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0CioJSUZCX0ZXSWRlbnRpdHkJCQlDRkdfRldfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgaWRlbnRpdHkgb2YgdGhlCioJCQkJCQkJInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKglJRkJfRldTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgoqCQkJCQkJCXRoZSAicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucwoqCUlGQl9IU0lTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBIVy9TVyBJL0YgcmFuZ2Ugb2YgdGhlIE5JQwoqCUlGQl9QUklJZGVudGl0eQkJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSWRlbnRpdHkgb2YgdGhlIFByaW1hcnkgRi9XCioJSUZCX1BSSVN1cAkJCQlDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIHN1cHBsaWVyIHJhbmdlIG9mIHRoZSBQcmltYXJ5IEYvVwoqCWFsbCBvdGhlcgkJCQlhbGwgTVNGIGFjY2Vzc2libGUgZmllbGRzLCB3aGljaCBhcmUgbm90IHNwZWNpZmllZCBhYm92ZSwgYXJlIHplcm8tZmlsbGVkCioKKi5DT05ESVRJT05TCiogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gYXNzdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgSS9PIEJhc2UgYWRkcmVzcy4KKgoqIE5vdGU6IGhjZl9jb25uZWN0IGRlZmF1bHRzIHRvIE5JQyBpbnRlcnJ1cHQgZGlzYWJsZWQgbW9kZSwgaS5lLiBhcyBpZiBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX0lOVF9PRkYgKQoqIHdhcyBjYWxsZWQuCioKKi5ERVNDUklQVElPTgoqIGhjZl9jb25uZWN0IHBhc3NlcyB0aGUgTVNGLWRlZmluZWQgbG9jYXRpb24gb2YgdGhlIElGQiB0byB0aGUgSENGIGFuZCBncmFudHMgb3IgcmV2b2tlcyBhY2Nlc3MgcmlnaHQgZm9yIHRoZQoqIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKKiBpb19iYXNlLiAgRXZlcnkgY2FsbCBvZiBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIgbW9kZSwgbXVzdCBldmVudHVhbGx5IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCBvZiBoY2ZfY29ubmVjdAoqIGluICJkaXNjb25uZWN0IiBtb2RlLiBDbGFsbGluZyBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIvImRpc2Nvbm5lY3QiIG1vZGUgY2FuIG5vdCBiZSBuZXN0ZWQuCiogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKKiBhZGRyZXNzIGFzIGEgaGFuZGxlIHdoZW4gaXQgcGVyZm9ybXMgYSBjYWxsKGJhY2spIG9mIGFuIE1TRi1mdW5jdGlvbiAoaS5lLiBtc2ZfYXNzZXJ0KS4KKgoqIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCiogaW5mb3JtYXRpb24gaXMgcmUtaW5pdGlhbGl6ZWQuCiogVGhpcyBpbXBsaWVzIHRoYXQgYWxsIHNldHRpbmdzIHdoaWNoIGFyZSBkb25lIHZpYSBoY2ZfYWN0aW9uIGFuZCBoY2ZfcHV0X2luZm8gKGUuZy4gQ0ZHX01CX0FTU0VSVCwgQ0ZHX1JFR19NQiwKKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgoqCiogSWYgSENGX0lOVF9PTiBpcyBzZWxlY3RlZCBhcyBjb21waWxlIG9wdGlvbiwgTklDIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICggcmVmIGNoYXB0ZXIgSENGX0FMSUdOIGluIDQuMS4xKQoqIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KKgoqLkRJQUdSQU0KKgoqMDoJVGhyb3VnaG91dCBoY2ZfY29ubmVjdCB5b3UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGUgY29ubmVjdCBmcm9tIHRoZSBkaXNjb25uZWN0IGNhc2UsIHdoaWNoIHJlcXVpcmVzCioJc29tZSBhdHRlbnRpb24gYWJvdXQgd2hhdCB0byB1c2UgYXMgIkkvTyIgYWRkcmVzcyB3aGVuIGZvciB3aGljaCBwdXJwb3NlLgoqMjoKKjJhOiBSZXNldCBILUlJIGJ5IHRvZ2dsaW5nIHJlc2V0IGJpdCBpbiBJTy1yZWdpc3RlciBvbiBhbmQgb2ZmLgoqCVRoZSBIQ0ZfVFlQRV9QUkVMT0FERUQgY2F0ZXJzIGZvciB0aGUgRE9TIGVudmlyb25tZW50IHdoZXJlIEgtSUkgaXMgbG9hZGVkIGJ5IGEgc2VwYXJhdGUgcHJvZ3JhbSB0bwoqCW92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KKglUaGUgbWFjcm8gT1BXIGlzIG5vdCB5ZXQgdXNlYWJsZSBiZWNhdXNlIHRoZSBJRkJfSU9CYXNlIGZpZWxkIGlzIG5vdCBzZXQuCioJTm90ZSAxOiBob3BlZnVsbHkgdGhlIGNsZWFyaW5nIGFuZCBpbml0aWFsaXppbmcgb2YgdGhlIElGQiAoc2VlIGJlbG93KSBhY3RzIGFzIGEgZGVsYXkgd2hpY2ggbWVldHMgdGhlCioJc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0CioJTm90ZSAyOiBpdCB0dXJucyBvdXQgdGhhdCBvbiBzb21lIEgvVyBjb25zdGVsbGF0aW9ucywgdGhlIGNsb2NrIHRvIGFjY2VzcyB0aGUgRUVQcm9tIGlzIG5vdCBsb3dlcmVkCioJdG8gYW4gYXBwcm9wcmlhdGUgZnJlcXVlbmN5IGJ5IEhSRUdfSU9fU1JFU0VULiBCeSBnaXZpbmcgYW4gSENNRF9JTkkgZmlyc3QsIHRoaXMgcHJvYmxlbSBpcyB3b3JrZWQgYXJvdW5kLgoqMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCioJRXYgcmVnaXN0ZXIgZ2l2ZXMgYSB3b3JrYWJsZSBzdHJhdGVneS4gVGhlIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGdpdmUgbXVjaCBjbHVlcy4KKjQ6CWNsZWFyIGFuZCBpbml0aWFsaXplIHRoZSBJRkIKKglUaGUgSENGIGhvdXNlIGtlZXBpbmcgaW5mbyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgemVybyBpcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB2YWx1ZSBmb3IgYXMgbXVjaCBhcwoqCWZlYXNpYmxlIElGQi1pdGVtcy4KKglUaGUgcmVhZGFibGUgZmllbGRzIG1lbnRpb25lZCBpbiB0aGUgZGVzY3JpcHRpb24gc2VjdGlvbiBhbmQgc29tZSBIQ0Ygc3BlY2lmaWMgZmllbGRzIGFyZSBnaXZlbiB0aGVpcgoqCWFjdHVhbCB2YWx1ZS4KKglJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBiZXN0IGd1ZXNzIGJlZm9yZSBjYWxpYnJhdGlvbgoqCUhjZl9jb25uZWN0IGRlZmF1bHRzIHRvICJubyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiIgKGltcGxpY2l0bHkgYWNoaWV2ZWQgYnkgdGhlIHplcm8tZmlsbGluZykuCio2OglSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKKgljYXN0IG5lZWRlZCB0byBnZXQgYXJvdW5kIHRoZSAibmVhciIgcHJvYmxlbSBpbiBET1MgQ09NIG1vZGVsCioJZXIgQzI0NDY6IG5vIGNvbnZlcnNpb24gZnJvbSB2b2lkIChfX25lYXIgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKgkJCQkJCQl0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQoqODoJSWYgYSBjb21tYW5kIGlzIGFwcGFyZW50bHkgc3RpbGwgYWN0aXZlIChhcyBpbmRpY2F0ZWQgYnkgdGhlIEJ1c3kgYml0IGluIENtZCByZWdpc3RlcikgdGhpcyBtYXkgaW5kaWNhdGUgYQoqCWJsb2NrZWQgY21kIHBpcGUgbGluZS4gIFRvIHVuYmxvY2sgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBkb25lOgoqCSAtIEFjayBldmVyeXRoaW5nCioJIC0gV2FpdCBmb3IgQnVzeSBiaXQgZHJvcCAgaW4gQ21kIHJlZ2lzdGVyCioJIC0gV2FpdCBmb3IgQ21kICBiaXQgcmFpc2UgaW4gRXYgIHJlZ2lzdGVyCioJVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cwoqCWZhaWwgKHByb3RfY250IGJlY29tZXMgMCksIHRoZW4gc29tZXRoaW5nIGlzIHNlcmlvdXMgd3JvbmcuIFJhdGhlciB0aGFuIFBBTklDSywgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUKKgluZXh0IGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIHRoZSBIQ0YgdG8gZ28gaW50byBERUZVTkNUIG1vZGUKKjEwOglBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5IGJsb2NrZWQpIGNtZCBwaXBlIGxpbmUKKglOb3RlIDE6IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSAoU2VuZCkgQ21kIGV2ZW50IGlzCioJcGVuZGluZyBvbiBub24taW5pdGlhbCBjYWxscwoqCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KKglIZXJtZXMgSW5pdGlhbGl6ZQoqMTI6CU9ubHkgSC1JSSBORUVEUyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRHVlIHRvIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBILUkgYW5kIEgtSUkKKglJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCioJSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRXhlY3V0aW5nIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kIGZvciBILUkgd291bGQgbm90IGhhcm0gYnV0IG5vdCBkbwoqCWFueXRoaW5nIHVzZWZ1bCBlaXRoZXIsIHNvIGl0IGlzIHNraXBwZWQuCioJVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KKjE0Ogl1c2UgaW9fYmFzZSBhcyBhIGZsYWcgdG8gbWVyZ2UgaGNmX2Nvbm5lY3QgYW5kIGhjZl9kaXNjb25uZWN0IGludG8gMSByb3V0aW5lCioJdGhlIGNhbGwgdG8gaW5pdCBhbmQgaXRzIHN1YnNlcXVlbnQgY2FsbCBvZiBjbWRfZXhlIHdpbGwgcmV0dXJuIEhDRl9FUlJfTk9fTklDIGlmIGFwcHJvcHJpYXRlLiBUaGlzIHN0YXR1cwoqCWlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KKgl0aW1lLgoqCiouTk9USUNFCioJT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBOVUxMLXBvaW50ZXIgaXMgbm90IGEgYml0LXBhdHRlcm4gb2YgYWxsIHplcm9zLCB0aGUgemVyby1maWxsaW5nIG9mIHRoZSBJRkIgcmVzdWx0cwoqCWluIGFuIGluY29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiBwb2ludGVycy4KKglUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94CioJYmFzZWQgb24gSUZCX01CU2l6ZSwgSUZCX01CV3AgYW5kIGlmYnAtPklGQl9NQlJwLiBUaGlzIGhhcyByYW1pZmljYXRpb25zIG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKglNYWlsQm94IHZpYSBoY2ZfcHV0X2luZm8gd2l0aCB0aGUgQ0ZHX1JFR19NQiB0eXBlLCBidXQgaXQgcHJldmVudHMgZGVwZW5kZW5jeSBvbiB0aGUgIk5VTEwtIm5lc3Mgb2YKKglJRkJfTUJwLgoqCiouTk9USUNFCioJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoZW4gYXNzZXJ0aW5nIGFuZCBsb2dnaW5nIGhjZl9jb25uZWN0LCBlLmcuCioJIC0gQXNzZXJ0aW5nIG9uIHJlLWVudHJhbmN5IG9mIGhjZl9jb25uZWN0IGJ5IG1lYW5zIG9mCioJICJIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiBIQ0ZfQVNTRVJUX0NPTk5FQ1QpID09IDAsIDAgKSIgaXMgbm90IHVzZWZ1bCBiZWNhdXNlIElGQiBjb250ZW50cwoqCSBhcmUgdW5kZWZpbmVkCioJIC0gQXNzZXJ0aW5nIGJlZm9yZSB0aGUgSUZCIGlzIGNsZWFyZWQgd2lsbCBjYXVzZSBtZGRfYXNzZXJ0KCkgdG8gaW50ZXJwcmV0IHRoZSBnYXJiYWdlIGluIElGQl9Bc3NlcnRSdG4KKgkgYXMgYSByb3V0aW5lIGFkZHJlc3MKKglUaGVyZWZvcmUgSENGVFJBQ0Ugbm9yIEhDRkxPR0VOVFJZIGlzIGNhbGxlZCBieSBoY2ZfY29ubmVjdC4KKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCnsKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmX2lvCQlpb19hZGRyOwpoY2ZfMzIJCXByb3RfY250OwpoY2ZfOAkJKnE7CkxUVl9TVFJDVAl4OwojaWYgSENGX0FTU0VSVAoJaGNmXzE2IHhhID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwOwoJLyogaXMgYXNzdW1lZCB0byBjYXVzZSBhbiBhc3NlcnQgbGF0ZXIgb24gaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCgkgKiB4YSA9PSBDRkdfRldfSURFTlRJVFkgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRob3V0IHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKCSAqIHhhID09IDAgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRoIHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKCSAqIHhhID09ICJnYXJiYWdlIiAoYW55IHZhbHVlIGV4Y2VwdCBDRkdfRldfSURFTlRJVFkgaXMgYWNjZXB0YWJsZSkgaW4gdGhlIGluaXRpYWwgY2FsbAoJICovCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgewkJCQkJLy9kaXNjb25uZWN0CgkJaW9fYWRkciA9IGlmYnAtPklGQl9JT0Jhc2U7CgkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwkJLy87P3dvcmthcm91bmQgYWdhaW5zdCBkeWluZyBGL1cgb24gc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBjYWxscwoJfSBlbHNlIHsJCQkJCQkJCQkJCS8vY29ubmVjdAkJCQkJCQkJLyogMCAqLwoJCWlvX2FkZHIgPSBpb19iYXNlOwoJfQoKI2lmIDAgLy87PyBpZiBhIHN1YnNlcXVlbnQgaGNmX2Nvbm5lY3QgaXMgcHJlY2VkZWQgYnkgYW4gaGNmX2Rpc2Nvbm5lY3QgdGhlIHdha2V1cCBpcyBub3QgbmVlZGVkICEhCiNpZiBIQ0ZfU0xFRVAKICAgIE9VVF9QT1JUX1dPUkQoIC4uLi4uK0hSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7IAkgICAgLy9PUFcgbm90IHlldCB1c2VhYmxlCglNU0ZfV0FJVCg4MDApOwkJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KCW5vdGUgdGhhdCBNU0ZfV0FJVCB1c2VzIG5vdCB5ZXQgZGVmaW5lZCEhISEgSUZCX0lPQmFzZSBhbmQgSUZCX1RpY2tJbmkgKHZpYSBQUk9UX0NOVF9JTkkpCglzbyBiZSBjYXJlZnVsIGlmIHRoaXMgY29kZSBpcyByZXN0b3JlZAojZW5kaWYgLy8gSENGX1NMRUVQCiNlbmRpZiAvLyAwCgojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCglPVVRfUE9SVF9XT1JEKCBpb19hZGRyICsgSFJFR19DTUQsIEhDTURfSU5JICk7ICAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQoJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CglIQ0ZfV0FJVF9XSElMRSggKElOX1BPUlRfV09SRCggaW9fYWRkciArICBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCU9VVF9QT1JUX1dPUkQoIChpb19hZGRyICsgSFJFR19JTyksIEhSRUdfSU9fU1JFU0VUICk7CS8vT1BXIG5vdCB5ZXQgdXNlYWJsZQkJCQkJLyogMmEqLwojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECglmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCglpZmJwLT5JRkJfTWFnaWMJCT0gSENGX01BR0lDOwoJaWZicC0+SUZCX1ZlcnNpb24JPSBJRkJfVkVSU0lPTjsKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAvL2EgbmV3IElGQiBkZW1vbnN0cmF0ZXMgaG93IGRpcnR5IHRoZSBzb2x1dGlvbiBpcwoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVRdID0gTlVMTDsJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSBOVUxMOwkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAojaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKCWlmYnAtPklGQl9UYWxseUxlbiA9IDEgKyAyICogKEhDRl9OSUNfVEFMX0NOVCArIEhDRl9IQ0ZfVEFMX0NOVCk7CS8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCglpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJaWZicC0+SUZCX0lPQmFzZQk9IGlvX2FkZHI7CQkJCS8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKCWlmYnAtPklGQl9DbnRsT3B0CT0gVVNFXzE2QklUOwojaWYgSENGX0FTU0VSVAoJYXNzZXJ0X2lmYnAgPSBpZmJwOwoJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDE7CiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCglpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CgkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IChNU0ZfQVNTRVJUX1JUTlApbXNmX2Fzc2VydDsJCQkJCQkJCQkJCS8qIDYgKi8KCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIJCQkJLy9idWlsZCB0aGUgc3RydWN0dXJlIHRvIHBhc3MgdGhlIGFzc2VydCBpbmZvIHRvIGhjZl9wdXRfaW5mbwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmxlbiA9IHNpemVvZihpZmJwLT5JRkJfQXNzZXJ0U3RyY3QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5iYXNlX3R5cCA9IENGR19NQl9BU1NFUlQ7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19jbnQgPSAxOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmZyYWdfYnVmWzBdLmZyYWdfbGVuID0KCQkoIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydEx2bCkgLSBvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9Bc3NlcnRMaW5lKSApIC8gc2l6ZW9mKGhjZl8xNik7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gJmlmYnAtPklGQl9Bc3NlcnRMaW5lOwojZW5kaWYgLy8gSENGX0FTU0VSVF9NQgojZW5kaWYgLy8gSENGX0FTU0VSVAoJSUZfUFJPVF9USU1FKCBwcm90X2NudCA9IGlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOyApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCgkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKCU9QVyggSFJFR19JTywgMHgwMDAwICk7CQkJCQkJLy9PUFcgdXNlYWJsZQkJCQkJCQkJCQkvKiAyYiovCglIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CglJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkKCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCApIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7ICkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCglIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYwICkJKSAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCglIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCglIQ0ZBU1NFUlQoICgoaGNmXzMyKSh2b2lkKilpZmJwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpKHZvaWQqKWlmYnAgKQoJSENGQVNTRVJUKCAoaW9fYWRkciAmIDB4MDAzRikgPT0gMCwgaW9fYWRkciApCgkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCglpZiAoSVBXKCBIUkVHX0NNRCApICYgSENNRF9CVVNZICkgewkJCQkJCQkJCQkJCQkJCQkvKiA4ICovCgkJCQkJCQkJCQkJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBCdXN5IGJpdCBkcm9wICBpbiBDbWQgcmVnaXN0ZXIKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSAmJiAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkgLyogaWYgcHJvdF9jbnQgPT0gMCwgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgREVGVU5DVCAqLwoJfQoJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCQkJCQkJCQkJCQkJCQkvKjEyKi8KCSh2b2lkKWNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKaWYgKCBpb19iYXNlICE9IEhDRl9ESVNDT05ORUNUICkgewoJCXJjID0gaW5pdCggaWZicCApOwkJCQkJCQkJCQkJCQkJCQkJCQkvKjE0Ki8KCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQl4LmxlbiA9IDI7CgkJCXgudHlwID0gQ0ZHX05JQ19CVVNfVFlQRTsKCQkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAmeCApOwoJCQlpZmJwLT5JRkJfQnVzVHlwZSA9IHgudmFsWzBdOwoJCQkvL0NGR19OSUNfQlVTX1RZUEUgbm90IHN1cHBvcnRlZCAtPiBkZWZhdWx0IDMyIGJpdHMvRE1BLCBNU0YgaGFzIHRvIG92ZXJydWxlIHZpYSBDRkdfQ05UTF9PUFQKCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCQkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfMTZCSVQ7CQkJLy9yZXNldCBVU0VfMTZCSVQKI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKI2lmIEhDRl9ETUEKCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7CQkJCS8vU0VUIERNQQojZWxzZQoJCQkJaWZicC0+SUZCX0lPUmFuZ2UgPSAweDQwIC8qaS5zLm8uIEhSRUdfSU9fUkFOR0UqLzsKI2VuZGlmIC8vIEhDRl9ETUEKCQkJfQoJCX0KCX0gZWxzZSBIQ0ZBU1NFUlQoICAoIGlmYnAtPklGQl9NYWdpYyBePSBIQ0ZfTUFHSUMgKSA9PSAwLCBpZmJwLT5JRkJfTWFnaWMgKSAvKk5PUCovOwoJLyogb2YgYWJvdmUgSENGQVNTRVJUIG9ubHkgdGhlIHNpZGUgZWZmZWN0IGlzIG5lZWRlZCwgTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15ICovCglpZmJwLT5JRkJfSU9CYXNlID0gaW9fYmFzZTsJCQkJCQkJCQkJCQkJCQkJCQkvKiAwKi8KCXJldHVybiByYzsKfSAvLyBoY2ZfY29ubmVjdAoKI2lmIEhDRl9ETUEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEZ1bmN0aW9uIGdldF9mcmFtZV9sc3QKKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCioKKiBUaGUgRnJhbWVMaXN0IHRvIGJlIHJlY2xhaW1lZCBhcyB3ZWxsIGFzIHRoZSBEZXNjcmlwdG9yTGlzdCBhbHdheXMgc3RhcnQgaW4gSUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXQoqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCioKKiBJZiBhIEZyYW1lTGlzdCBpcyBhdmFpbGFibGUsIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCB0byB0dXJuZWQgaW50byBhIG5ldyBERUxXQSBEZXNjcmlwdG9yOgoqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CioJIERFTFdBIERlc2NyaXB0b3IKKiAgLSB0aGUgcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3B5IGJ5IHNldHRpbmcgdGhlIG5leHRfZGVzY19hZGRyIGF0IE5VTEwKKiAgLSB0aGUgRE1BIGNvbnRyb2wgYml0cyBvZiB0aGUgY29weSBhcmUgY2xlYXJlZCB0byBkbyBub3QgY29uZnVzZSB0aGUgTVNGCiogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCioJIG9mIHRoZSBGcmFtZUxpc3QsIHRodXMgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBsYXN0IERlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdC4KKiAgLSBJRkJfRmlyc3REZXNjIGlzIGNoYW5nZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhhdCByZXBsYWNlZCAob3JpZ2luYWwpIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LAoqCSBpLmUuIHRoZSAibmV3IiBERUxXQSBEZXNjcmlwdG9yLgoqCiogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCiogT24gdG9wIG9mIHRoYXQsIGl0IGFkanVzdHMgRE1BIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBJRkIgc3RydWN0dXJlLgoJLy8gcGVyZm9ybSBhIGNvcHlpbmctc2NoZW1lIHRvIGNpcmN1bXZlbnQgdGhlICdsYXN0IGhvc3Qgb3duZWQgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmVjbGFpbWVkJyBsaW1pdGF0aW9uIGltcG9zZWQgYnkgSDIuNSdzIERNQSBoYXJkd2FyZSBkZXNpZ24KCS8vIGEgJ3JlY2xhaW0gZGVzY3JpcHRvcicgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgSENGOgoqCiogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CioKIDg6IEJlIGNhcmVmdWwgb25jZSB5b3Ugc3RhcnQgcmUtb3JkZXJpbmcgdGhlIHN0ZXBzIGluIHRoZSBjb3B5IHByb2Nlc3MsIHRoYXQgaXQgc3RpbGwgd29ya3MgZm9yIGNhc2VzCiogCW9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCmdldF9mcmFtZV9sc3QoIElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcgKQp7CgpERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKREVTQ19TVFJDVCAqY29weSwgKnAsICpwcmV2OwoKCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQoJCQkJCQkJCS8vaWYgRnJhbWVMaXN0CglpZiAoIGhlYWQgKSB7CgkJCQkJCQkJLy8uICBzZWFyY2ggZm9yIGxhc3QgZGVzY3JpcHRvciBvZiBmaXJzdCBGcmFtZUxpc3QKCQlwID0gcHJldiA9IGhlYWQ7CgkJd2hpbGUgKCAoIHAtPkJVRl9TSVpFICYgREVTQ19FT1AgKSA9PSAwICYmIHAtPm5leHRfZGVzY19hZGRyICkgewoJCQlpZiAoICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApID09IDAgKSB7CS8vY2xlYXIgY29udHJvbCBiaXRzIHdoZW4gZGlzYWJsZWQKCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKCQkJfQoJCQlwcmV2ID0gcDsKCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCX0KCQkJCQkJCQkvLy4gIGlmIERNQSBlbmFibGVkCgkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgewoJCQkJCQkJCS8vLiAgLiAgaWYgbGFzdCBkZXNjcmlwdG9yIG9mIEZyYW1lTGlzdCBpcyBETUEgb3duZWQKCQkJCQkJCQkvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCgkJCWlmICggcC0+QlVGX0NOVCAmIERFU0NfRE1BX09XTkVEIHx8IGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CgkJCQkJCQkJLy8uICAuICAuICByZWZ1c2UgdG8gcmV0dXJuIEZyYW1lTGlzdCB0byBjYWxsZXIKCQkJCWhlYWQgPSBOVUxMOwoJCQl9CgkJfQoJfQoJCQkJCQkJCS8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKCWlmICggaGVhZCApIHsKCQkJCQkJCQkvLy4gIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yIChpbXBsaWVzIERNQSBkaXNhYmxlZCkKIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewoJCQkJCQkJCS8vLiAgLiAgY2xlYXIgRGVzY3JpcHRvckxpc3QKCQkJLyo7P2lmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9Ki8gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IE5VTEw7CgkJCQkJCQkJLy8uICBlbHNlCgkJfSBlbHNlIHsKCQkJCQkJCQkvLy4gIC4gIHN0cmlwIGhhcmR3YXJlLXJlbGF0ZWQgYml0cyBmcm9tIGxhc3QgZGVzY3JpcHRvcgoJCQkJCQkJCS8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CgkJCWNvcHkgPSBoZWFkOwoJIAkJaGVhZCA9IGhlYWQtPm5leHRfZGVzY19hZGRyOwoJCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKCQkJY29weS0+YnVmX3BoeXNfYWRkciA9IHAtPmJ1Zl9waHlzX2FkZHI7CgkJCWNvcHktPmJ1Zl9hZGRyID0gcC0+YnVmX2FkZHI7CgkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAoJCQljb3B5LT5CVUZfQ05UID0gcC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOwkvL2dldCByaWQgb2YgREVTQ19ETUFfT1dORUQKI2lmIChIQ0ZfRVhUKSAmIEhDRl9ERVNDX1NUUkNUX0VYVAoJCQljb3B5LT5ERVNDX01TRlN1cCA9IHAtPkRFU0NfTVNGU3VwOwojZW5kaWYgLy8gSENGX0RFU0NfU1RSQ1RfRVhUCgkJCQkJCQkJLy8uICAuICB0dXJuIGludG8gYSBERUxXQSBEZXNjcmlwdG9yCgkJCXAtPmJ1Zl9hZGRyID0gTlVMTDsKCQkJCQkJCQkvLy4gIC4gIGNoYWluIGNvcHkgdG8gcHJldgkJCQkJCQkJCQkJLyogOCovCgkJCXByZXYtPm5leHRfZGVzY19hZGRyID0gY29weTsKCQkJCQkJCQkvLy4gIC4gIGRldGFjaCByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGZyb20gRnJhbWVMaXN0CgkJCWNvcHktPm5leHRfZGVzY19hZGRyID0gTlVMTDsKCQkJY29weS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCgkJCQkJCQkJLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYwoJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJCQkJCQkJLy8uICBzdHJpcCBERVNDX1NPUCBmcm9tIGZpcnN0IGRlc2NyaXB0b3IKCQloZWFkLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwoJCS8vaGVhZC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAoJCWhlYWQtPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAoJfQoJCQkJCQkJCS8vcmV0dXJuIHRoZSBqdXN0IGRldGFjaGVkIEZyYW1lTGlzdCAoaWYgYW55KQoJcmV0dXJuIGhlYWQ7Cn0gLy8gZ2V0X2ZyYW1lX2xzdAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbiBwdXRfZnJhbWVfbHN0CioKKiBUaGlzIGZ1bmN0aW9uCioKKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKiBUaGUgZm9sbG93aW5nIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhjZl9kbWFfdHgvcnhfcHV0LCBpbiBvcmRlciB0byBnZXQgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIEFzc2VydCBmYWlscyBpZgoqIC0JRE1BIGlzIG5vdCBlbmFibGVkCiogLQlkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0JYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtCWEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0JdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtCWEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqIC0JUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoKKi5OT1RJQ0UKKiBUaGUgYXNzZXJ0cyBtYXJrZWQgd2l0aCAqc2MqIGFyZSByZWFsbHkgc2FuaXR5IGNoZWNrcyBmb3IgdGhlIEhDRiwgdGhleSBjYW4gKHN1cHBvc2VkbHkpIG5vdCBiZSBpbmZsdWVuY2VkCiogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgoKCQkvLyBUaGUgTVNGIGlzIHJlcXVpcmVkIHRvIHN1cHBseSB0aGUgSENGIHdpdGggYSBzaW5nbGUgZGVzY3JpcHRvciBmb3IgTVNGIHR4IHJlY2xhaW0gcHVycG9zZXMuCgkJLy8gVGhpcyAncmVjbGFpbSBkZXNjcmlwdG9yJyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgZmFjdCB0aGF0IGl0cyBidWZfYWRkciBmaWVsZCBpcyB6ZXJvLgoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmU6CgkqIC0gbWFrZSBlYWNoIGRlc2NyaXB0b3IgaW4gdGhpcyByeC1jaGFpbiBETUEtb3duZWQuCgkqIC0gQWxzbyBzZXQgdGhlIGNvdW50IHRvIHplcm8uIEVPUCBhbmQgU09QIGJpdHMgYXJlIGFsc28gY2xlYXJlZC4KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFtZV9sc3QoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGludCB0eF9yeF9mbGFnICkKewoJREVTQ19TVFJDVAkqcCA9IGRlc2NwOwoJaGNmXzE2IHBvcnQ7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECglIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICkKCUhDRkFTU0VSVCggcCAsIDAgKQoKCXdoaWxlICggcCApIHsKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQoJCUhDRkFTU0VSVCggKHAtPkJVRl9TSVpFICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9TSVpFICkKCQlwLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwkJCQkJLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCgkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKCQlpZiAoIHAtPm5leHRfZGVzY19hZGRyICkgewovLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKQoJCQlIQ0ZBU1NFUlQoIHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkciwgKGhjZl8zMilwLT5uZXh0X2Rlc2NfYWRkciApCgkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CgkJfSBlbHNlIHsJCQkJCQkJCQkvLwoJCQlwLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMDsKCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgewkJCS8vIERFTFdBIERlc2NyaXB0b3IKCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApCS8vc2luZ2xldG9uIERlc2NyaXB0b3JMaXN0CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddKQoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pCgkJCQlkZXNjcC0+QlVGX0NOVCA9IDA7IC8vJj0gfkRFU0NfRE1BX09XTkVEOwoJCQkJaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOwovLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9IGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKCQkJCQkJCQkJCQkJCS8vIGlmICJyZWN5Y2xpbmciIGEgRnJhbWVMaXN0CgkJCQkJCQkJCQkJCQkvLyAoZS5nLiBjYWxsZWQgZnJvbSBoY2ZfY250bCggSENGX0NOVExfRU5BQkxFICkKCQkJCQkJCQkJCQkJCS8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKCQkJfSBlbHNlIHsJCQkJCQkJCS8vYSAicmVhbCIgRnJhbWVMaXN0LCBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCwKCQkJCQkJICAgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyKQovLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID0gZGVzY3A7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CgkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKCQkJCWlmICggdHhfcnhfZmxhZyApIHsKCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsJLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CgkJCQkJcG9ydCA9IEhSRUdfVFhETUFfUFRSMzI7CgkJCQl9CgkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CgkJCX0KCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJfQp9IC8vIHB1dF9mcmFtZV9sc3QKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0KCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWRlY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgcHJvdmlkZXMgdGhhdCBtZXNzYWdlIHRvIHRoZSBNU0YuCioJCQkJcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglwb2ludGVyIHRvIGEgRnJhbWVMaXN0CioKKi5ERVNDUklQVElPTgoqIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCiogRE1BIGVuZ2luZS4gSW4gYWRkaXRpb24gaGNmX2RtYV9yeF9nZXQgY2FuIGJlIHVzZWQgdG8gcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4KKiB3aGVuIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCBlLmcuIGFzIHBhcnQgb2YgYSBkcml2ZXIgdW5sb2FkaW5nIHN0cmF0ZWd5LgoqIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCiogdGhyb3VnaCB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIG9mIElGQl9EbWFQYWNrZXRzLiBUaGUgY2FsbGluZyBtdXN0IHN0b3Agd2hlbiBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZCwgYXQKKiB3aGljaCB0aW1lIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgaXMgYWxzbyBjbGVhcmVkIGJ5IHRoZSBIQ0YgdG8gYXJtIHRoZSBtZWNoYW5pc20gZm9yIHRoZSBuZXh0IGZyYW1lCiogcmVjZXB0aW9uLgoqIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgRE1BIEVuZ2luZSBpcyBjdXJyZW50bHkgZW5hYmxlZCAoYXMgY29udHJvbGxlZCB2aWEgaGNmX2NudGwpLCBpZiB0aGUgRE1BIGNvbnRyb2xsZXIKKiBkZXBvc2l0ZWQgYW4gUngtZnJhbWUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGlzIGZyYW1lIGlzIGRldGFjaGVkIGZyb20gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LAoqIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQoqIGNhbGxlci4KKiBJZiBubyBzdWNoIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3J4X2dldCBkZXBlbmRzIG9uIHRoZQoqIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBlbmFibGVkLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcyB1c2VkOgoqIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCiogLSBJZiB0aGVyZSBpcyBubyBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCiogLSBJZiB0aGVyZSBpcyBubyBERUxXQSBEZXNjcmlwdG9yLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKgoqIElmIHRoZSBNU0YgcGVyZm9ybXMgYW4gZGlzYWJsZS9lbmFibGUgc2VxdWVuY2Ugd2l0aG91dCBleGhhdXN0aW5nIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCBhcyBkZXNjcmliZWQgYWJvdmUsCiogdGhlIGVuYWJsZSBjb21tYW5kIHdpbGwgcmVzZXQgYWxsIGhvdXNlIGtlZXBpbmcgaW5mb3JtYXRpb24sIGkuZS4gYWxyZWFkeSByZWNlaXZlZCBidXQgbm90IHlldCBieSB0aGUgTVNGCiogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KKgoqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBkZWNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgoqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgoqIElmIGFwcHJvcHJpYXRlLCBkZWNhcHN1bGF0aW9uIGlzIGRvbmUgYnkgbW92aW5nIHNvbWUgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlcnMgYW5kIHVwZGF0aW5nIHRoZSBkZXNjcmlwdG9ycwoqIGFjY29yZGluZ2x5LgoqISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KKgoqLkRJQUdSQU0KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkRFU0NfU1RSQ1QqCmhjZl9kbWFfcnhfZ2V0IChJRkJQIGlmYnApCnsKREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CgoJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfUlggKTsKCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKCgkJCQkJCQkJCQkJLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJaWYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAogICAgewppbnQgaTsKREVTQ19TVFJDVCAqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsJLy9wb2ludGVyIHRvIDJuZCBkZXNjcmlwdG9yIG9mIGZyYW1lCgkJSENGQVNTRVJUKHAsIDApCgkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIChtYXliZSkgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCgkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCgkJaSA9ICood2NpX3JlY29yZHApJmRlc2NwLT5idWZfYWRkcltIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CgkJCS8vIFRoZSAybmQgZGVzY3JpcHRvciBjb250YWlucyBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KCQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID09IChwLT5idWZfYWRkcls1XSArIChwLT5idWZfYWRkcls0XTw8OCkgKyAyKjYgKyAyIC0gOCksIHAtPkJVRl9DTlQgKQoJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24KCQkJSENGQVNTRVJUKHAtPkJVRl9TSVpFID49OCwgcC0+QlVGX1NJWkUpCgkJCS8vIG1vdmUgU0FbMjo1XSBpbiB0aGUgc2Vjb25kIGJ1ZmZlciB0byByZXBsYWNlIHBhcnQgb2YgdGhlIFNOQVAgaGVhZGVyCgkJCWZvciAoIGk9MzsgaSA+PSAwOyBpLS0pIHAtPmJ1Zl9hZGRyW2krOF0gPSBwLT5idWZfYWRkcltpXTsKCQkJLy8gY29weSBEQVswOjVdLCBTQVswOjFdIGZyb20gZmlyc3QgYnVmZmVyIHRvIHNlY29uZCBidWZmZXIKCQkJZm9yICggaT0wOyBpPDg7IGkrKykgcC0+YnVmX2FkZHJbaV0gPSBkZXNjcC0+YnVmX2FkZHJbSEZTX0FERFJfREVTVCArIGldOwoJCQkvLyBtYWtlIGZpcnN0IGJ1ZmZlciBzaG9ydGVyIGluIGNvdW50CgkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX0FERFJfREVTVDsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRU5DCglpZiAoIGRlc2NwID09IE5VTEwgKSBpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1JETUFEOyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVCApCglyZXR1cm4gZGVzY3A7Cn0gLy8gaGNmX2RtYV9yeF9nZXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCXZvaWQgaGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQoqLlBVUlBPU0UJCXN1cHBseSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgoqCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlhZGRyZXNzIG9mIGEgRGVzY3JpcHRvckxpc3QKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCiogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFwcGx5IHRvIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBhbmQgdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZAoqIHdpdGggdGhlIGZpcnN0IDIgZGVzY3JpcHRvcnMuIEluZGVwZW5kZW50IG9mIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUsIHRoZSBDT1VOVCBmaWVsZHMgYXJlIGlnbm9yZWQuCiogQSBzcGVjaWFsIGNhc2UgaXMgdGhlIHN1cHBseWluZyBvZiB0aGUgREVMV0EgZGVzY3JpcHRvciwgd2hpY2ggbXVzdCBiZSBzdXBwbGllZCBhcyB0aGUgZmlyc3QgZGVzY3JpcHRvci4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgoqIC0gaW4gY2FzZSBkZWNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YgaXMgc2VsZWN0ZWQ6CioJICAtCVRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIGV4YWN0IHNpemUgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBSeEZTIHVwIHRvIHRoZSA4MDIuMyBEZXN0QWRkcgoqCQlmaWVsZCAoPT0gMjkgd29yZHMpLgoqCSAgLQlUaGUgRnJhbWVMaXN0IGRvZXMgbm90IGNvbnNpc3RzIG9mIGF0IGxlYXN0IDIgRGVzY3JpcHRvcnMuCioJICAtCVRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIHRoZSBtaW5pbXVtIHNpemUgb2YgOCBieXRlcy4KKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKiAtIERNQSBpcyBub3QgZW5hYmxlZAoqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCiogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoqCiouRElBR1JBTQoqCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKaGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQp7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfUlhfUFVULCAweERBMDEgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoKCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGRlc2NwLCBETUFfUlggKTsKI2lmIEhDRl9BU1NFUlQgJiYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJaWYgKCBkZXNjcC0+YnVmX2FkZHIgKSB7CgkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPT0gSENGX0RNQV9SWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCgkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIsIDAgKSAvLyBmaXJzdCBkZXNjcmlwdG9yIHNob3VsZCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlc2NyaXB0b3IKCQkvLyBUaGUgc2Vjb25kIERCIGlzIGZvciBTTkFQIGFuZCBwYXlsb2FkIHB1cnBvc2VzLiBJdCBzaG91bGQgYmUgYSBtaW5pbXVtIG9mIDEyIGJ5dGVzIGluIHNpemUuCgkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFID49IDEyLCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFICkKCX0KI2VuZGlmIC8vIEhDRkFTU0VSVCAvIEhDRl9FTkMKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfUFVUICkKfSAvLyBoY2ZfZG1hX3J4X3B1dAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCiouUFVSUE9TRQkJRE1BIG1vZGU6IHJlY2xhaW1zIGFuZCBkZWNhcHN1bGF0ZXMgcGFja2V0cyBpbiB0aGUgdHggZGVzY3JpcHRvciBjaGFpbiBpZjoKKgkJCQkgLSBBIFR4IHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBob3N0LVJBTSBpbnRvIE5JQy1SQU0gYnkgdGhlIERNQSBlbmdpbmUKKgkJCQkgLSBUaGUgSGVybWVzL0RNQWVuZ2luZSBoYXZlIGJlZW4gZGlzYWJsZWQKKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCXBvaW50ZXIgdG8gYSByZWNsYWltZWQgVHggcGFja2V0LgoqCiouREVTQ1JJUFRJT04KKiBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZDoKKiBXaGVuIGEgbm9uLWVtcHR5IHBvb2wgb2YgVHggZGVzY3JpcHRvcnMgZXhpc3RzIChjcmVhdGVkIGJ5IG1lYW5zIG9mIGhjZl9kbWFfcHV0X3R4KSwgdGhlIE1TRgoqIGlzIHN1cHBvc2VkIHRvIGVtcHR5IHRoYXQgcG9vbCBieSBtZWFucyBvZiBoY2ZfZG1hX3R4X2dldCBjYWxscyBhZnRlciB0aGUgZGlzYWJsZSBpbiBhbgoqIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlLgoqCiouRElBR1JBTQoqCiouTk9USUNFCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkRFU0NfU1RSQ1QqCmhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQp7CkRFU0NfU1RSQ1QgKmRlc2NwOwkvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAoKCWRlc2NwID0gZ2V0X2ZyYW1lX2xzdCggaWZicCwgRE1BX1RYICk7CglpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApICAvLyFiZSBhd2FyZSBvZiB0aGUgbWlzc2luZyBjdXJseSBicmFja2V0CgkJCQkJCQkJCQkJLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCWlmICggKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfVFlQRSApCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkJCSB8fCAoIGRlc2NwLT5CVUZfQ05UID09IEhGU19EQVQgKQojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJKSB7IC8vIHBlcmZvcm0gZGVjYXBzdWxhdGlvbiBpZiBuZWVkZWQKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyIC09IEhDRl9EQVNBX1NJWkU7CgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVCAJCSArPSBIQ0ZfREFTQV9TSVpFOwoJCX0KI2VuZGlmIC8vIEhDRl9FTkMKCWlmICggZGVzY3AgPT0gTlVMTCApIHsgIC8vOz9jb3VsZCBiZSBpbnRlZ3JhdGVkIGludG8gZ2V0X2ZyYW1lX2xzdAoJCWlmYnAtPklGQl9EbWFQYWNrZXRzICY9IChoY2ZfMTYpfkhSRUdfRVZfVERNQUQ7Cgl9CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1RYX0dFVCApCglyZXR1cm4gZGVzY3A7Cn0gLy8gaGNmX2RtYV90eF9nZXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCXZvaWQgaGNmX2RtYV90eF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKKi5QVVJQT1NFCQlwdXRzIGEgcGFja2V0IGluIHRoZSBUeCBETUEgcXVldWUgaW4gaG9zdCByYW0gYW5kIGtpY2tzIG9mZiB0aGUgVHhEbWEgZW5naW5lLgoqCQkJCXN1cHBseSB0aGUgVHgtREVMV0EgZGVzY3JpcHRvci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlhZGRyZXNzIG9mIFR4IERlc2NyaXB0b3IgQ2hhaW4gKGkuZS4gYSBzaW5nbGUgVHggZnJhbWUpCioJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBlbmNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgoqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgoqCiogUmVnYXJkbGVzcyBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudCwgdGhlIGRlc2NyaXB0b3IgbGlzdCBjcmVhdGVkIHRvIGRlc2NyaWJlIHRoZSBmcmFtZSB0byBiZQoqIHRyYW5zbWl0dGVkLCBtdXN0IHN1cHBseSBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyLCBwcmVjZWRpbmcgdGhlIGFjdHVhbCBmcmFtZSB0byBiZSB0cmFuc21pdHRlZC4KKiBCYXNpY2FsbHksIHRoaXMgb25seSBzdXBwbGllcyB3b3JraW5nIHN0b3JhZ2UgdG8gdGhlIEhDRiB3aGljaCBwYXNzZXMgdGhpcyBvbiB0byB0aGUgRE1BIGVuZ2luZS4KKiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBjb250ZW50cyBvZiB0aGlzIHNwYWNlIGRvIG5vdCBtYXR0ZXIuCiogTmV2ZXJ0aGVsZXNzIEJVRl9DTlQgbXVzdCB0YWtlIGluIGFjY291bnQgdGhpcyBzdG9yYWdlLgoqIFRoaXMgd29ya2luZyBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyIG1heSBub3QgYmUgZnJhZ21lbnRlZCwgdGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGJlCiogc3VmZmljaWVudGx5IGxhcmdlIHRvIGNvbnRhaW4gYXQgbGVhc3QgdGhlIDgwMi4xMSBoZWFkZXIsIGkuZS4gSEZTX0FERFJfREVTVCAoMjkgd29yZHMgb3IgMHgzQSBieXRlcykuCiogVGhpcyB3YXksIHRoZSBIQ0YgY2FuIHNpbXBseSwgcmVnYXJkbGVzcyB3aGV0aGVyIG9yIG5vdCB0aGUgSENGIGVuY2Fwc3VsYXRlcyB0aGUgZnJhbWUsIHdyaXRlIHRoZSBwYXJhbWV0ZXIKKiB0eF9jbnRsIGF0IG9mZnNldCAweDM2IChIRlNfVFhfQ05UTCkgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KKiBOb3RlIHRoYXQgaXQgaXMgYWxsb3dlZCB0byBoYXZlIHBhcnQgb3IgYWxsIG9mIHRoZSBhY3R1YWwgZnJhbWUgcmVwcmVzZW50ZWQgYnkgdGhlIGZpcnN0IGRlc2NyaXB0b3IgYXMgbG9uZwoqIGFzIHRoZSByZXF1aXJlbWVudCBmb3Igc3RvcmFnZSBmb3IgdGhlIDgwMi4xMSBoZWFkZXIgaXMgbWV0LCBpLmUuIHRoZSA4MDIuMyBmcmFtZSBzdGFydHMgYXQgb2Zmc2V0CiogSEZTX0FERFJfREVTVC4KKiBFeGNlcHQgZm9yIHRoZSBBc3NlcnQgb24gdGhlIDFzdCBidWZmZXIgaW4gY2FzZSBvZiBFbmNhcHN1YWx0aW9uLCB0aGUgU0laRSBmaWVsZHMgYXJlIGlnbm9yZWQuCioKKiBJbiBjYXNlIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUgaXMgY29tcGlsZWQgaW4sIHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgoqIG8gVGhlIEJVRl9DTlQgb2YgdGhlIGZpcnN0IGJ1ZmZlciBjaGFuZ2VzIGZyb20gYSBtaW5pbXVtIG9mIDB4M0EgYnl0ZXMgdG8gZXhhY3RseSAweDNBLCBpLmUuIHRoZSB3b3Jrc3BhY2UKKgl0byBzdG9yZSB0aGUgODAyLjExIGhlYWRlcgoqIG8gVGhlIEJVRl9TSVpFIG9mIHRoZSBmaXJzdCBidWZmZXIgaXMgYXQgbGVhc3QgdGhlIHNwYWNlIG5lZWRlZCB0byBzdG9yZSB0aGUKKgktIDgwMi4xMSBoZWFkZXIgKDI5IHdvcmRzKQoqCS0gODAyLjMgaGVhZGVyLCBpLmUuIDEyIGJ5dGVzIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIDIgYnl0ZXMgbGVuZ3RoIGZpZWxkCioJLSA2IGJ5dGVzIFNOQVAtaGVhZGVyCiogICBUaGlzIHJlc3VsdHMgaW4gMzkgd29yZHMgb3IgMHg0RSBieXRlcyBvciBIRlNfVFlQRS4KKiAgIE5vdGUgdGhhdCBpZiB0aGUgQlVGX1NJWkUgaXMgbGFyZ2VyIHRoYW4gMHg0RSwgdGhpcyBzdXJwbHVzIGlzIG5vdCB1c2VkLgoqIG8gVGhlIGFjdHVhbCBmcmFtZSBiZWdpbnMgaW4gdGhlIDJuZCBkZXNjcmlwdG9yICh3aGljaCBpcyBhbHJlYWR5IGltcGxpZWQgYnkgdGhlIEJVRl9DTlQgPT0gMHgzQSByZXF1aXJlbWVudCkgYW5kIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBjb250YWlucyBhdCBsZWFzdCB0aGUgODAyLjMgaGVhZGVyLCBpLmUuIHRoZSAxNCBieXRlcyByZXByZXNlbnRpbmcgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgbGVuZ3RoL3R5cGUgZmllbGQKKgoqICAgV2hlbiB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA8PSAxNTAwKSwgIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gZGVzY3JpcHRvcnMKKiAgIG9yIGJ1ZmZlcnMuCioKKiAgIFdoZW4gdGhlIEhDRiBhY3R1YWxseSBlbmNhcHN1bGF0ZXMgKGkuZS4gbGVuZ3RoL3R5cGUgZmllbGQgPiAxNTAwKSwgaXQgc3VjY2Vzc2l2ZWx5IHdyaXRlcywgc3RhcnRpbmcgYXQKKiAgIG9mZnNldCBIRlNfQUREUl9ERVNUICgweDNBKSBpbiB0aGUgZmlyc3QgYnVmZmVyOgoqICAgICAtIHRoZSA4MDIuMyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uLCBjb3BpZWQgZnJvbSB0aGUgYmVnaW4gb2YgdGhlIHNlY29uZCBidWZmZXIKKiAgICAgLSB0aGUgZnJhbWUgbGVuZ3RoLCBkZXJpdmVkIGZyb20gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFnbWVudHMsIGNvcnJlY3RlZCBmb3IgdGhlIFNOQVAKKiAgIAloZWFkZXIgbGVuZ3RoIGFuZCBUeXBlIGZpZWxkIGFuZCBpZ25vcmluZyB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIExlbmd0aCBmaWVsZAoqIAkgIC0gdGhlIGFwcHJvcHJpYXRlIHNuYXAgaGVhZGVyIChUdW5uZWwgb3IgMTA0MiwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBmaWVsZCkuCioKKiAJIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5OgoqIAkgIC0gdGhlIGZpcnN0IGRlc2NyaXB0b3IgY291bnQgaXMgY2hhbmdlZCBmcm9tIDB4M0EgdG8gMHg0RSAoSEZTX1RZUEUpLCB3aGljaCBtYXRjaGVzIDB4M0EgKyAxMiArIDIgKyA2CiogCSAgLSB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgY291bnQgaXMgZGVjcmVhc2VkIGJ5IDEyLCBiZWluZyB0aGUgbW92ZWQgYWRkcmVzc2luZyBpbmZvcm1hdGlvbgoqIAkgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIChwaHlzaWNhbCkgYnVmZmVyIGFkZHJlc3MgaXMgaW5jcmVhc2VkIGJ5IDEyLgoqCiogV2hlbiB0aGUgZGVzY3JpcHRvcnMgYXJlIHJldHVybmVkIGJ5IGhjZl9kbWFfdHhfZ2V0LCB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGZpcnN0IHR3byBkZXNjcmlwdG9ycyBpcwoqIHVuZG9uZS4KKgoqIFVuZGVyIGFueSBvZiB0aGUgYWJvdmUgc2NlbmFyaW9zLCB0aGUgYXNzZXJ0IEJVRl9DTlQgPD0gQlVGX1NJWkUgbXVzdCBiZSB0cnVlIGZvciBhbGwgZGVzY3JpcHRvcnMKKiBJbiBjYXNlIG9mIGVuY2Fwc3VsYXRpb24sIEJVRl9TSVpFIG9mIHRoZSAxc3QgZGVzY3JpcHRvciBpcyBhc3NlcnRlZCB0byBiZSBhdCBsZWFzdCBIRlNfVFlQRSAoMHg0RSksIHNvIGl0IGlzIE5PVCB0ZXN0ZWQuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIHR4X2NudGwgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKiAtIGluIGNhc2UgZW5jYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgoqCSAgLQlUaGUgRnJhbWVMaXN0IGRvZXMgbm90IGNvbnNpc3RzIG9mIGF0IGxlYXN0IDIgRGVzY3JpcHRvcnMuCioJICAtCVRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZXhhY3RseSB0aGUgKHNwYWNlIGZvcikgdGhlIDgwMi4xMSBoZWFkZXIgKD09IDI4IHdvcmRzKQoqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgc2l6ZSB0byBhZGRpdGlvbmFsbHkgYWNjb21tb2RhdGUgdGhlIDgwMi4zIGhlYWRlciBhbmQgdGhlCioJCVNOQVAgaGVhZGVyIG9mIHRoZSBmcmFtZSBhZnRlciBlbmNhcHN1bGF0aW9uICg9PSAzOSB3b3JkcykuCioJICAtCVRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUvbGVuZ3RoJyAoPT0xNCBieXRlcyBvciA3IHdvcmRzKQoqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAoqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCiouRElBR1JBTQoqCiouTk9USUNFCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqCioxOglXcml0ZSB0eF9jbnRsIHBhcmFtZXRlciB0byBIRlNfVFhfQ05UTCBmaWVsZCBpbnRvIHRoZSBIZXJtZXMtc3BlY2lmaWMgaGVhZGVyIGluIGJ1ZmZlciAxCio0OglkZXRlcm1pbmUgd2hldGhlciBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZCBhbmQgd3JpdGUgdGhlIHR5cGUgKHR1bm5lbCBvciAxMDQyKSBhbHJlYWR5IGF0IHRoZSBhcHByb3ByaWF0ZQoqCW9mZnNldCBpbiB0aGUgMXN0IGJ1ZmZlcgoqNjoJQnVpbGQgdGhlIGVuY2Fwc3VhbHRpb24gZW52ZWxvcHBlIGluIHRoZSBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIDFzdCBidWZmZXIKKgktIENvcHkgREEvU0EgZmllbGRzIGZyb20gdGhlIDJuZCBidWZmZXIKKiAgIC0gQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAoc25hcC1oZWFkZXIgKyB0eXBlLWZpZWxkICsgdGhlIGxlbmd0aCBvZiBhbGwgYnVmZmVyIGZyYWdtZW50cwoqICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIDgwMi4zIGZyYW1lIChpLmUgYWxsIGRlc2NyaXB0b3JzIGV4Y2VwdCB0aGUgZmlyc3QpLCBidXQgbm90IHRoZSBEZXN0aW5hdGlvbkFkZHJlc3MsCiogICAgIFNvdXJjZUFkZHJlc3MgYW5kIGxlbmd0aC1maWVsZCkKKiAgICAgQXNzZXJ0IHRoZSBtZXNzYWdlIGxlbmd0aAoqCSAgV3JpdGUgbGVuZ3RoLiBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4gQkUgZm9ybWF0LCBoZW5jZSBvbiBMRSBwbGF0Zm9ybXMgdGhlIGxlbmd0aCBtdXN0IGJlIGNvbnZlcnRlZAoqCSAgOz8gVEhJUyBJUyBOT1QgV0hBVCBDVVJSRU5UTFkgSVMgSU1QTEVNRU5URUQKKgktIFdyaXRlIHNuYXAgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc25hcCBoZWFkZXIgaXMgTk9UIGNvcGllZCwgdGhhdCBieXRlIGlzIGFscmVhZHkgaW4KKgkgIHBsYWNlIGFzIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBoY2ZfZW5jYXAuCioJTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdG8gc2tpbiBhIGNhdC4gVG8gZXhwcmVzcyB0aGUgb2Zmc2V0cyBpbiB0aGUgMXN0IGJ1ZmZlciB3aGlsZSB3cml0aW5nCioJdGhlIHNuYXAgaGVhZGVyLCBIRlNfVFlQRSBpcyBjaG9zZW4gYXMgYSByZWZlcmVuY2UgcG9pbnQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZ3Jhc3AgdGhhdCB0aGUgc25hcCBoZWFkZXIKKglhbmQgZW5jYXBzdWFsdGlvbiB0eXBlIGFyZSBhdCBsZWFzdCByZWxhdGl2ZSBpbiB0aGUgcmlnaHQuCio4Ogltb2RpZnkgMXN0IGRlc2NyaXB0b3IgdG8gcmVmbGVjdCBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKyBTbmFwLWhlYWRlcgoqCW1vZGlmeSAybmQgZGVzY3JpcHRvciB0byBza2lwIHRoZSBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKERBL1NBCioxMDogc2V0IGVhY2ggZGVzY3JpcHRvciB0byAnRE1BIG93bmVkJywgIGNsZWFyIGFsbCBvdGhlciBjb250cm9sIGJpdHMuCioJU2V0IFNPUCBiaXQgb24gZmlyc3QgZGVzY3JpcHRvci4gU2V0IEVPUCBiaXQgb24gbGFzdCBkZXNjcmlwdG9yLgoqMTI6IEVpdGhlciBhcHBlbmQgdGhlIGN1cnJlbnQgZnJhbWUgdG8gYW4gZXhpc3RpbmcgZGVzY3JpcHRvciBsaXN0IG9yCioxNDogY3JlYXRlIGEgbGlzdCBiZWdpbm5pbmcgd2l0aCB0aGUgY3VycmVudCBmcmFtZQoqMTY6IHJlbWVtYmVyIHRoZSBuZXcgZW5kIG9mIHRoZSBsaXN0CioyMDogaGFuZCB0aGUgZnJhbWUgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKaGNmX2RtYV90eF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKewpERVNDX1NUUkNUCSpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOwppbnQJCQlpOwoKI2lmIEhDRl9BU1NFUlQKCWludCB4ID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQID8gdHhfY250bCAmIH5IRlNfVFhfQ05UTF9QT1JUIDogdHhfY250bDsKCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKQojZW5kaWYgLy8gSENGX0FTU0VSVAoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfVFhfUFVULCAweERBMDMgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCAoIGlmYnAtPklGQl9DbnRsT3B0ICYgKFVTRV9ETUF8RE1BX0VOQUJMRUQpICkgPT0gKFVTRV9ETUF8RE1BX0VOQUJMRUQpLCBpZmJwLT5JRkJfQ250bE9wdCkKCglpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKCQkqKGhjZl8xNiopKGRlc2NwLT5idWZfYWRkciArIEhGU19UWF9DTlRMKSA9IHR4X2NudGw7CQkJCQkJCQkJCQkvKjEqLwojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkJCQkJCQkJCQkvL2F0IGxlYXN0IDIgZGVzY3JpcG9ycwoJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0FERFJfREVTVCwgZGVzY3AtPkJVRl9DTlQgKQkvL2V4YWN0IGxlbmd0aCByZXF1aXJlZCBmb3IgMXN0IGJ1ZmZlcgoJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID49IEhDRl9ETUFfVFhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKQkvL21pbmltYWwgc3RvcmFnZSBmb3IgZW5jYXBzdWxhdGlvbgoJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApOwkJCQkJLy9hdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlJyBpbiAybmQgYnVmZmVyCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJCS8qIGlmIHdlIGFyZSBkb2luZyBQUEsgKy8tIENNSUMsIG9yIHdlIGFyZSBzZW5kaW5nIGEgRERQIGZyYW1lICovCgkJaWYgKCAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PTiApIHx8CgkJCSAoICggcC0+QlVGX0NOVCA+PSAyMCApCQkgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKCQkJICggcC0+YnVmX2FkZHJbMTJdID09IDB4QUEgKSAmJiAoIHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBICkgJiYKCQkJICggcC0+YnVmX2FkZHJbMTRdID09IDB4MDMgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE1XSA9PSAweDAwICkgJiYKCQkJICggcC0+YnVmX2FkZHJbMTZdID09IDB4NDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE3XSA9PSAweDk2ICkgJiYKCQkJICggcC0+YnVmX2FkZHJbMThdID09IDB4MDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwICkpKQoJCXsKCQkJLyogY29weSB0aGUgREEvU0EgdG8gdGhlIGZpcnN0IGJ1ZmZlciAqLwoJCQlmb3IgKCBpID0gMDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsKCQkJCWRlc2NwLT5idWZfYWRkcltpICsgSEZTX0FERFJfREVTVF0gPSBwLT5idWZfYWRkcltpXTsKCQkJfQoJCQkvKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kIGZyYWdtZW50IG9ubHkgKi8KCQkJaSA9IDA7CgkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKTsKCQkJaSAtPSBIQ0ZfREFTQV9TSVpFIDsKCQkJLyogY29udmVydCB0aGUgbGVuZ3RoIGZpZWxkIHRvIGJpZyBlbmRpYW4sIHVzaW5nIHRoZSBlbmRpYW4gZnJpZW5kbHkgbWFjcm9zICovCgkJCWkgPSBDTlZfU0hPUlRfVE9fQklHKGkpOwkJLy8hISB0aGlzIGNvbnZlcnRzIE9OTFkgb24gTEUgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgbm9uLUNDWCBjb2RlCgkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSAoaGNmXzE2KWk7CgkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX0RBVDsKCQkJLy8gbW9kaWZ5IDJuZCBkZXNjcmlwdG9yIHRvIHNraXAgdGhlICdEYS9TYScgZmllbGRzCgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkciArPSBIQ0ZfREFTQV9TSVpFOwoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQJCSAtPSBIQ0ZfREFTQV9TSVpFOwoJCX0KCQllbHNlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQl7CgkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSA9IGhjZl9lbmNhcCgmZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSk7CQkvKjQqLwoJCQlpZiAoIGRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSAhPSBFTkNfTk9ORSApIHsKCQkJCWZvciAoIGk9MDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsJCQkJCQkJCQkJCQkJCS8qNiovCgkJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbaV07CgkJCQl9CgkJCQlpID0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIgLSAoIDIqNiArIDIgKTsKCQkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CgkJCQkqKGhjZl8xNiopKCZkZXNjcC0+YnVmX2FkZHJbSEZTX0xFTl0pID0gQ05WX0VORF9TSE9SVChpKTsJLy8hISB0aGlzIGNvbnZlcnRzIG9uIEFMTCBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBDQ1ggY29kZQoJCQkJZm9yICggaT0wOyBpIDwgc2l6ZW9mKHNuYXBfaGVhZGVyKSAtIDE7IGkrKykgewoJCQkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRSAtIHNpemVvZihzbmFwX2hlYWRlcikgKyBpXSA9IHNuYXBfaGVhZGVyW2ldOwoJCQkJfQoJCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfVFlQRTsJCQkJCQkJCQkJCQkJCQkJCS8qOCovCgkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIJKz0gSENGX0RBU0FfU0laRTsKCQkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVAkJCS09IEhDRl9EQVNBX1NJWkU7CgkJCX0KCQl9CiNlbmRpZiAvLyBIQ0ZfRU5DCiAgICB9CglwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1RYICk7CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVCApCn0gLy8gaGNmX2RtYV90eF9wdXQKCiNlbmRpZiAvLyBIQ0ZfRE1BCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJaGNmXzggaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKKi5QVVJQT1NFCQl0ZXN0IHdoZXRoZXIgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgoqCiouQVJHVU1FTlRTCioJdHlwZQkJKEZhcikgcG9pbnRlciB0byB0aGUgKEJpZyBFbmRpYW4pIFR5cGUvTGVuZ3RoIGZpZWxkIGluIHRoZSBtZXNzYWdlCioKKi5SRVRVUk5TCioJRU5DX05PTkUJCWxlbi90eXBlIGlzICJsZW4iICggKEJJR19FTkRJQU4pdHlwZSA8PSAxNTAwICkKKglFTkNfVFVOTkVMCQlsZW4vdHlwZSBpcyAidHlwZSIgYW5kIDB4ODBGMyBvciAweDgxMzcKKglFTkNfMTA0MgkJbGVuL3R5cGUgaXMgInR5cGUiIGJ1dCBub3QgMHg4MEYzIG9yIDB4ODEzNwoqCiouQ09ORElUSU9OUwoqCU5JQyBJbnRlcnJ1cHRzCWQuYwoqCiouREVTQ1JJUFRJT04KKiBUeXBlIG11c3QgcG9pbnQgdG8gdGhlIExlbi9UeXBlIGZpZWxkIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHRoZSAyLWJ5dGUgZmllbGQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIDYgYnl0ZQoqIERlc3RpbmF0aW9uIEFkZHJlc3MgYW5kIDYgYnl0ZSBTb3VyY2UgQWRkcmVzcy4gIFRoZSAyIHN1Y2Nlc3NpdmUgYnl0ZXMgYWRkcmVzc2VkIGJ5IHR5cGUgYXJlIGludGVycHJldGVkIGFzCiogYSBCaWcgRW5kaWFuIHZhbHVlLiAgSWYgdGhhdCB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTUwMCwgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiA4MDIuMwoqIGZvcm1hdC4gIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIEV0aGVybmV0LUlJIGZvcm1hdC4gIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgTGVuL1R5cCwKKiBCcmlkZ2UgVHVubmVsIG9yIFJGQzEwNDIgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCioKKi5ESUFHUkFNCioKKiAgMToJcHJlc3VtZSA4MDIuMywgaGVuY2UgcHJlc2V0IHJldHVybiB2YWx1ZSBhdCBFTkNfTk9ORQoqICAyOgljb252ZXJ0IHR5cGUgZnJvbSAibmV0d29yayIgRW5kaWFuIGZvcm1hdCB0byBuYXRpdmUgRW5kaWFuCiogIDQ6CXRoZSBsaXRtdXMgdGVzdCB0byBkaXN0aW5ndWlzaCB0eXBlIGFuZCBsZW4uCioJVGhlIGhhcmQgY29kZSAibWFnaWMiIHZhbHVlIG9mIDE1MDAgaXMgaW50ZW50aW9uYWwgYW5kIHNob3VsZCBOT1QgYmUgcmVwbGFjZWQgYnkgYSBtbmVtb25pYyBiZWNhdXNlIGl0IGlzCioJbm90IHJlbGF0ZWQgYXQgYWxsIHRvIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgc3VwcG9ydGVkICBieSB0aGUgSGVybWVzLgoqICA2OgljaGVjayB0eXBlIGFnYWluc3Q6CioJCTB4ODBGMwkvL0FwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCioJCTB4ODEzNwkvL0lQWAoqCXRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBlbmNhcHN1bGF0aW9uCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBIQ0ZfRU5DQVAJLy9pLmUgSENGX0VOQyBvciBIQ0ZfRU5DX1NVUAojaWYgISAoIChIQ0ZfRU5DQVApICYgSENGX0VOQ19TVVAgKQpIQ0ZfU1RBVElDCiNlbmRpZiAvLyBIQ0ZfRU5DQVAKaGNmXzgKaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKewoKaGNmXzgJcmMgPSBFTkNfTk9ORTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCmhjZl8xNgl0ID0gKGhjZl8xNikoKnR5cGU8PDgpICsgKih0eXBlKzEpOwkJCQkJCQkJCQkJCQkJCQkvKiAyICovCgoJaWYgKCB0ID4gMTUwMCApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA0ICovCgkJaWYgKCB0ID09IDB4ODEzNyB8fCB0ID09IDB4ODBGMyApIHsKCQkJcmMgPSBFTkNfVFVOTkVMOwkJCQkJCQkJCQkJCQkJCQkJCQkvKiA2ICovCgkJfSBlbHNlIHsKCQkJcmMgPSBFTkNfMTA0MjsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0gLy8gaGNmX2VuY2FwCiNlbmRpZiAvLyBIQ0ZfRU5DQVAKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiouUFVSUE9TRQkJT2J0YWlucyB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDYXJkIGFuZCBmcm9tIHRoZSBIQ0YuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsdHZwCQlhZGRyZXNzIG9mIExlbmd0aFR5cGVWYWx1ZSBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgIndoYXQiIGFuZCB0aGUgImhvdyBtdWNoIiBvZiB0aGUKKgkJCQlpbmZvcm1hdGlvbiB0byBiZSBjb2xsZWN0ZWQgZnJvbSB0aGUgSENGIG9yIGZyb20gdGhlIEhlcm1lcwoqCiouUkVUVVJOUwoqCUhDRl9FUlJfTEVOCQkJVGhlIHByb3ZpZGVkIGJ1ZmZlciB3YXMgdG9vIHNtYWxsCioJSENGX1NVQ0NFU1MJCQlTdWNjZXNzCiohIQl2aWEgY21kX2V4ZSAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKQoqCUhDRl9FUlJfTk9fTklDCQlOSUMgcmVtb3ZlZCBkdXJpbmcgcmV0cmlldmFsCioJSENGX0VSUl9USU1FX09VVAlFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1ciBpbiBleHBlY3RlZCB0aW1lCiohIQl2aWEgY21kX2V4ZSBhbmQgc2V0dXBfYmFwICh0eXBlID49IENGR19SSURfRldfTUlOICkKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCUhDRiBpcyBpbiBkZWZ1bmN0IG1vZGUgKGJpdHMgMHg3RiByZWZsZWN0IGNhdXNlKQoqCiouREVTQ1JJUFRJT04KKiBUaGUgVC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBSSUQgd2FudGVkLiBUaGUgUklECiogaW5mb3JtYXRpb24gaWRlbnRpZmllZCBieSB0aGUgVC1maWVsZCBpcyBjb3BpZWQgaW50byB0aGUgVi1maWVsZC4KKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKKiBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZCBpdHNlbGYuCiogT24gcmV0dXJuLCB0aGUgTC1maWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB3b3JkcyBhY3R1YWxseSBjb250YWluZWQgYnkgdGhlIFR5cGUgYW5kIFZhbHVlIGZpZWxkcy4KKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCiogVi1maWVsZCBjYW4gY29udGFpbiBhdCBtb3N0ICJJbml0aWFsIERhdGFMZW5ndGgiIC0gMSB3b3JkcyBvZiBkYXRhLgoqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZSBjb21wbGV0ZSBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpbmRpY2F0ZWQgYnkgdGhlCiogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCiogSW5mb3JtYXRpb24gYmxvY2tzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudCBGL1cgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0CiogbW9yZSB0YWxsaWVzIHRoYW4gZWFybGllciB2ZXJzaW9ucy4KKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKKiBhcyBmaXRzIGlzIGNvcGllZCwgYW5kIGFuIGVycm9yIHN0YXR1cyBvZiBIQ0ZfRVJSX0xFTiBpcyByZXR1cm5lZC4KKgoqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQoqIE5JQyBpcyBhYnNlbnQuIFRoZSBNU0YgY2Fubm90LCBob3dldmVyLCB0aW1lbHkgZGV0ZWN0IGEgQ2FyZCByZW1vdmFsIGlmIHRoZSBDYXJkIGlzIHJlbW92ZWQgd2hpbGUKKiBoY2ZfZ2V0X2luZm8gaXMgaW4gcHJvZ3Jlc3MuICBUaGVyZWZvcmUsIHRoZSBIQ0YgcGVyZm9ybXMgaXRzIG93biBjaGVjayBvbiBDYXJkIHByZXNlbmNlIGFmdGVyIHRoZSByZWFkCiogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAoqIEhDRl9FUlJfTk9fTklDIGlzIHJldHVybmVkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgRGF0YSBCdWZmZXIgaXMgdW5wcmVkaWN0YWJsZS4gVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkCiogaW4gY2FzZSBvZiB0aGUgIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHMgbGlrZSBDRkdfVEFMTElFUy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyAwIG9yIDEgb3IgaGFzIGFuIGV4Y2Vzc2l2ZSB2YWx1ZSAoaS5lLiBleGNlZWRzIEhDRl9NQVhfTFRWKS4KKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KKgoqLkRJQUdSQU0KKglIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcwoqCWxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgTWFpbEJveCBJbmZvIGJsb2NrLCBvbmx5IGFzIG11Y2ggYXMgZml0cyBpbiB0aGUgUEMgUkFNIGJ1ZmZlciBpcyBjb3BpZWQuIEFmdGVyCioJdGhlIGNvcHlpbmcgdGhlIE1haWxCb3ggUmVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgTWFpbEJveCBJbmZvIGJsb2NrLCBoZW5jZSB0aGUKKglyZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCioJcmVmbGVjdGVkIGluIHRoZSByZXR1cm4gc3RhdHVzLiBOb3RlIHRoYXQgaGNmX2dldF9pbmZvIGd1YXJhbnRlZXMgdGhlIGxlbmd0aCBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBtZWV0cwoqCXRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiBhdCBsZWFzdCAyLCBzbyBubyBQQyBSQU0gYnVmZmVyIG92ZXJydW4uCioKKglDYWxsaW5nIGhjZl9nZXRfbWJfaW5mbyB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggSW5mbyBibG9jayBhdmFpbGFibGUgb3Igd2hlbiB0aGVyZSBpcyBubyBNYWlsQm94IGF0IGFsbCwKKglyZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KKgoqMTI6CXNlZSBOT1RJQ0UKKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCioJb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCioyMDogIkhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkiIGlzIG5vdCBzdWl0YWJsZSBiZWNhdXNlIHRoaXMgd2lsbCBhbHdheXMgdHJpZ2dlciBhcyBzaWRlIGVmZmVjdCBvZgoqCXRoZSBIQ0ZBU1NFUlQgaW4gaGNmX3B1dF9pbmZvIHdoaWNoIGNhbGxzIGhjZl9nZXRfaW5mbyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIFJJRCBleGlzdHMgYXQgYWxsLgoKKi5OT1RJQ0UKKgoqCSJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgoqCUNGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCioJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQoqCU5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKKgoqCVJlbWFya3M6IFRyYW5zZmVycyBvcGVyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCioJQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCioJVGhlIGV4YWN0IGxheW91dCBvZiB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgYWN0aW9uIGNvZGUuIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZQoqCWNvbXBsZXRlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW5kaWNhdGVkIGJ5IGxlbiBpcyBjb3BpZWQuICBMZW4KKglhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKglIZXJtZXMgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0IG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuIEl0IGlzIGEgY29uc2Npb3VzCioJZGVjaXNpb24gdGhhdCB1bnVzZWQgcGFydHMgb2YgdGhlIFBDIFJBTSBidWZmZXIgYXJlIG5vdCBjbGVhcmVkLgoqCioJUmVtYXJrczogVGhlIG9ubHkgZXJyb3IgYWdhaW5zdCB3aGljaCBpcyBwcm90ZWN0ZWQgaXMgdGhlICJSZWFkIGVycm9yIiBhcyByZXN1bHQgb2YgQ2FyZCByZW1vdmFsLiBPbmx5IHRoZQoqCWxhc3QgaGNmX2lvX3N0cmluZyBuZWVkIHRvIGJlIHByb3RlY3RlZCBiZWNhdXNlIGlmIHRoZSBmaXJzdCBmYWlscyB0aGUgc2Vjb25kIHdpbGwgZmFpbCBhcyB3ZWxsLiBDaGVja2luZwoqCWZvciBjbWRfZXhlIGVycm9ycyBpcyBzdXBwb3NlZCBzdXBlcmZsdW91cyBiZWNhdXNlIHByb2JsZW1zIGluIGNtZF9leGUgYXJlIGFscmVhZHkgY2F1Z2h0IG9yIHdpbGwgYmUKKgljYXVnaHQgYnkgaGNmX2VuYWJsZS4KKgoqCUNGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCioKKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKgkgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKQlvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfVEFMTElFUykgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwoqCQlhcmUgdmFsaWQKKgkgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCioJCUxUViByZWNvcmQgd2l0aCBhIHplcm8gdmFsdWUgaW4gdGhlIEwtZmllbGQgZm9yIGFsbCBUeXAtY29kZXMgaXQgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIGlzCioJCWRlZmluZWQgYW5kIGludGVuZGVkIGJlaGF2aW9yLCBzbyBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoIG9uIHRoaXMgcGhlbm9tZW5hLgoqCSAgLQlhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCioKKi5DT05ESVRJT05TCiogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJbGVuID0gbHR2cC0+bGVuOwpoY2ZfMTYJCXR5cGUgPSBsdHZwLT50eXA7CndjaV9yZWNvcmRwCXAgPSAmbHR2cC0+bGVuOwkJLy9kZXN0aW5hdGlvbiB3b3JkIHBvaW50ZXIgKGluIExUViByZWNvcmQpCmhjZl8xNgkJKnEgPSBOVUxMOwkJCQkvKiBzb3VyY2Ugd29yZCBwb2ludGVyICBOb3RlISEgRE9TIENPTSBjYW4ndCBjb3BlIHdpdGggRkFSCgkJCQkJCQkJCSAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQoJCQkJCQkJCQkgKi8KaW50CQkJaTsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0dFVF9JTkZPLCBsdHZwLT50eXAgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBsdHZwLCAwICkKCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBsdHZwLT50eXAsIGx0dnAtPmxlbiApICkKCglsdHZwLT5sZW4gPSAwOwkJCQkJCQkJLy9kZWZhdWx0IHRvOiBObyBJbmZvIEF2YWlsYWJsZQojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgLy9maWx0ZXIgb3V0IGFsbCBzcGVjaWFscwoJZm9yICggaSA9IDA7ICggcSA9IHh4eHhbaV0gKSAhPSBOVUxMICYmIHFbMV0gIT0gdHlwZTsgaSsrICkgLypOT1AqLzsKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCiNpZiBIQ0ZfVEFMTElFUwoJaWYgKCB0eXBlID09IENGR19UQUxMSUVTICkgewkJCQkJCQkJCQkJCQkvKjMqLwoJCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfVEFMTElFUyApOwoJCXEgPSAoaGNmXzE2KikmaWZicC0+SUZCX1RhbGx5TGVuOwoJfQojZW5kaWYgLy8gSENGX1RBTExJRVMKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCWlmICggdHlwZSA9PSBDRkdfTUJfSU5GTyApIHsKCQlpZiAoIGlmYnAtPklGQl9NQkluZm9MZW4gKSB7CgkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewoJCQkJaWZicC0+SUZCX01CUnAgPSAwOyAvLzs/UHJvYmFibHkgc3VwZXJmbHVvdXMKCQkJfQoJCQlxID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwoJCQlpZmJwLT5JRkJfTUJScCArPSAqcSArIDE7CS8vdXBkYXRlIHJlYWQgcG9pbnRlcgoJCQlpZiAoIGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdID09IDB4RkZGRiApIHsKCQkJCWlmYnAtPklGQl9NQlJwID0gMDsKCQkJfQoJCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CgkJfQoJfQojZW5kaWYgLy8gSENGX0VYVF9NQgoJaWYgKCBxICE9IE5VTEwgKSB7CQkJCQkJLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KCQlpID0gbWluKCBsZW4sICpxICkgKyAxOwkJCQkvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQoJCXdoaWxlICggaS0tICkgewoJCQkqcCsrID0gKnE7CiNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKCQkJaWYgKCBxID4gJmlmYnAtPklGQl9UYWxseVR5cCAmJiB0eXBlID09IENGR19UQUxMSUVTICkgewoJCQkJKnEgPSAwOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19SRVNFVAoJCQlxKys7CgkJfQoJfSBlbHNlIHsJCQkJCQkJCS8vIG5vdCBhIHNwZWNpYWwgbm9yIENGR19UQUxMSUVTIG5vciBDRkdfTUJfSU5GTwoJCWlmICggdHlwZSA9PSBDRkdfQ05UTF9PUFQgKSB7CQkJCQkJCQkJCS8vcmVhZCBiYWNrIGVmZmVjdGl2ZSBvcHRpb25zCgkJCWx0dnAtPmxlbiA9IDI7CgkJCWx0dnAtPnZhbFswXSA9IGlmYnAtPklGQl9DbnRsT3B0OwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCgkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfUFJPRF9EQVRBICkgeyAgLy9vbmx5IG5lZWRlZCBmb3Igc29tZSB0ZXN0IHRvb2wgb24gdG9wIG9mIEgtSUkgTkRJUyBkcml2ZXIKaGNmX2lvCQlpb19wb3J0Owp3Y2lfYnVmcAlwdDsJCQkJCS8vcG9pbnRlciB3aXRoIHRoZSAicmlnaHQiIHR5cGUsIGp1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUICYgMHg3RSkgKTsKCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwkJLy90byBwcmV2ZW50IHNpZGUgZWZmZWN0cyBvZiB0aGUgTVNGLWRlZmluZWQgbWFjcm8KCQkJcCA9IGx0dnAtPnZhbDsJCQkJCS8vZGVzdGluYXRpb24gY2hhciBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQoJCQlpID0gbGVuIC0gMTsKCQkJaWYgKGkgPiAwICkgewoJCQkJcHQgPSAod2NpX2J1ZnApcDsJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CgkJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBwdCwgaSApOyAvL3NwYWNlIHVzZWQgYnkgVDogLTEKCQkJfQoJCX0gZWxzZSBpZiAoIHR5cGUgPT0gQ0ZHX0NNRF9IQ0YgKSB7CiNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCgkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKCQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQoJCQkJbHR2cC0+bGVuID0gbWluKCBsZW4sIDQgKTsJCQkJCQkJCS8vUkVTVE9SRSBsdHYgbGVuZ3RoCgkJCQlQLT5hZGRfaW5mbyA9IElQVyggUC0+bW9kZSApOwoJCQl9CiN1bmRlZiBQCiNlbmRpZiAvLyBIQ0ZfRVhUX05JQ19BQ0NFU1MKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENGR19GV19QUklOVEYpIHsKICAgICAgICAgICByYyA9IGZ3X3ByaW50ZihpZmJwLCAoQ0ZHX0ZXX1BSSU5URl9TVFJDVCopbHR2cCk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoJCX0gZWxzZSBpZiAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKSB7Ci8vOz8gYnkgdXNpbmcgSENNRF9CVVNZIG9wdGlvbiB3aGVuIGNhbGxpbmcgY21kX2V4ZSwgdXNpbmcgYSBnZXRfZnJhZyB3aXRoIGxlbmd0aCAwIGp1c3QgdG8gc2V0IHVwIHRoZQovLzs/IEJBUCBhbmQgY2FsbGluZyBjbWRfY21wbCwgeW91IGNvdWxkIG1lcmdlIHRoZSAyIEJ1c3kgd2FpdHMuIFdoZXRoZXIgdGhpcyByZWFsbHkgaGVscHMgKGFuZCB3aGF0Ci8vOz8gd291bGQgYmUgdGhlIG9wdGltYWwgc2VxdWVuY2UgaW4gY21kX2V4ZSBhbmQgZ2V0X2ZyYWcpIHdvdWxkIGhhdmUgdG8gYmUgTUVBU1VSRUQKLyoxNyovCQlpZiAoICggcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUywgdHlwZSApICkgPT0gSENGX1NVQ0NFU1MgJiYKCQkJCSAoIHJjID0gc2V0dXBfYmFwKCBpZmJwLCB0eXBlLCAwLCBJT19JTiApICkgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZsdHZwLT5sZW4sIDIqbGVuKzIgQkVfUEFSKDIpICk7CgkJCQlpZiAoIElQVyggSFJFR19TVEFUICkgPT0gMHhGRkZGICkgewkJCQkJLy9OSUMgcmVtb3ZhbCB0ZXN0CgkJCQkJbHR2cC0+bGVuID0gMDsKCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApCgkJCQl9CgkJCX0KLyoxMiovCX0gZWxzZSBIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApIC8qTk9QKi87IC8vTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15Cgl9CglpZiAoIGxlbiA8IGx0dnAtPmxlbiApIHsKCQlsdHZwLT5sZW4gPSBsZW47CgkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJcmMgPSBIQ0ZfRVJSX0xFTjsKCQl9Cgl9CglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTIHx8ICggcmMgPT0gSENGX0VSUl9MRU4gJiYgaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8SENGX1RSQUNFX1BVVF9JTkZPICksCgkJCSAgIE1FUkdFXzIoIHR5cGUsIHJjICkgKQkJCQkJCQkJCQkJCQkJCQkvKjIwKi8KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9HRVRfSU5GTyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2dldF9pbmZvCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiouUFVSUE9TRQkJVHJhbnNmZXJzIG9wZXJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgQ2FyZCBhbmQgdG8gdGhlIEhDRi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCXNwZWNpZmllcyB0aGUgUklEIChhcyBkZWZpbmVkIGJ5IEhlcm1lcyBJL0YpIG9yIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCiohIQl2aWEgY21kX2V4ZQoqCUhDRl9FUlJfTk9fTklDIAkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCioJSENGX0VSUl9USU1FX09VVAlFeHBlY3RlZCBGL1cgZXZlbnQgZGlkIG5vdCBvY2N1ciBpbiB0aW1lCioJSENGX0VSUl9ERUZVTkNUXy4uLgoqISEJdmlhIGRvd25sb2FkCQkJCUNGR19ETE5WX1NUQVJUIDw9IHR5cGUgPD0gQ0ZHX0RMX1NUT1AKKiEhCXZpYSBwdXRfaW5mbwkJCQlDRkdfUklEX0NGR19NSU4gPD0gdHlwZSA8PSBDRkdfUklEX0NGR19NQVgKKiEhCXZpYSBwdXRfZnJhZwoqCiouREVTQ1JJUFRJT04KKiBUaGUgTC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCiogVGhlIEwtdmFsdWUgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQuCiogVGhlIFQtIGZpZWxkIHNwZWNpZmllcyB0aGUgUklEIHBsYWNlZCBpbiB0aGUgVi1maWVsZCBieSB0aGUgTVNGLgoqCiogTm90IGFsbCBDRkctY29kZXMgY2FuIGJlIHVzZWQgZm9yIGhjZl9wdXRfaW5mby4gIFRoZSBmb2xsb3dpbmcgQ0ZHLWNvZGVzIGFyZSB2YWxpZCBmb3IgaGNmX3B1dF9pbmZvOgoqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgoqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIGluIHRoaXMgZ3JvdXAgd2lsbCBub3QgYWZmZWN0IHRoZSBGL1cKKiBhbmQgSENGIGJlaGF2aW9yIHVudGlsIGhjZl9jbnRsX3BvcnQoIEhDRl9QT1JUX0VOQUJMRSkgaXMgY2FsbGVkLgoqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKKiBDaGFuZ2VzIG1hZGUgYnkgaGNmX3B1dF9pbmZvIHRvIENGR19jb2RlcyB3aWxsIGFmZmVjdCB0aGUgRi9XIGFuZCBIQ0YgYmVoYXZpb3IgaW1tZWRpYXRlbHkuCiogbyBDRkdfUFJPRy4KKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBpbml0aWF0ZSBhbmQgdGVybWluYXRlIHRoZSBwcm9jZXNzIHRvIGRvd25sb2FkIGRhdGEgZWl0aGVyIHRvCiogdm9sYXRpbGUgb3IgdG8gbm9uLXZvbGF0aWxlIFJBTSBvbiB0aGUgTklDIGFzIHdlbGwgYXMgZm9yIHRoZSBhY3R1YWwgZG93bmxvYWQuCiogbyBDRkctY29kZXMgcmVsYXRlZCB0byB0aGUgSENGIGJlaGF2aW9yLgoqIFRoZSByZWxhdGVkIENGRy1jb2RlcyBhcmU6CiogIC0gQ0ZHX1JFR19NQgoqICAtIENGR19SRUdfQVNTRVJUX1JUTlAKKiAgLSBDRkdfUkVHX0lORk9fTE9HCiogIC0gQ0ZHX0NNRF9OSUMKKiAgLSBDRkdfQ01EX0RPTkdMRQoqICAtIENGR19DTURfSENGCiogIC0gQ0ZHX05PVElGWQoqCiogQWxsIExUVi1yZWNvcmRzICJ1bmtub3duIiB0byB0aGUgSENGIGFyZSBmb3J3YXJkZWQgdG8gdGhlIEYvVy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKiAtIGhjZl9wdXRfaW5mbyB3YXMgY2FsbGVkIHdpdGhvdXQgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdAoqIC0gdHlwZSBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBpcyBpbnZhbGlkLCBpLmUuIG5laXRoZXIgSENGIG5vciBGL1cgY2FuIGhhbmRsZSB0aGUgdmFsdWUuCiogLSBsZW5ndGggZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgYXQgZW50cnkgaXMgbGVzcyB0aGFuIDEgb3IgZXhjZWVkcyBNQVhfTFRWX1NJWkUuCiogLSByZWdpc3RlcmluZyBhIE1haWxCb3ggd2l0aCBzaXplIGxlc3MgdGhhbiA2MCBvciBhIG5vbi1hbGlnbmVkIGJ1ZmZlciBhZGRyZXNzIGlzIHVzZWQuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QKKglOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKglSZW1hcmtzOiAgSW4gY2FzZSBvZiBIZXJtZXMgQ29uZmlndXJhdGlvbiBMVFZzLCB0aGUgY29kZXMgZm9yIHRoZSB0eXBlIGFyZSAiY2xldmVybHkiIGNob3NlbiB0byBiZQoqCWlkZW50aWNhbCB0byB0aGUgUklELiBIZXJtZXMgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgaW50byB0aGUKKglDYXJkLgoqCUluIGNhc2Ugb2YgSENGIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIHR5cGUgdmFsdWVzIGFyZSBjaG9zZW4gaW4gYSByYW5nZSB3aGljaCBkb2VzIG5vdCBvdmVybGFwIHRoZQoqCVJJRC1yYW5nZS4KKgoqMjA6CioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQKaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKaW50IHJjID0gSENGX1NVQ0NFU1M7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCUhDRkFTU0VSVCggbHR2cCwgMCApCglIQ0ZBU1NFUlQoIDEgPCBsdHZwLT5sZW4gJiYgbHR2cC0+bGVuIDw9IEhDRl9NQVhfTFRWICsgMSwgbHR2cC0+bGVuICkKCgkJCQkJCQkJCQkJLy9hbGwgY29kZXMgYmV0d2VlbiAweEZBMDAgYW5kIDB4RkNGRiBhcmUgcGFzc2VkIHRvIEhlcm1lcwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQogewloY2ZfMTYgaTsKCWhjZl8zMiBGQVIgKiBrZXlfcDsKCglpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgfHwgbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9NQVBQRURfS0VZICkgewoJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKCQlpID0gVFhfS0VZOwkJLy9pLmUuIFR4S2V5SW5kaWNhdG9yID09IDEsIEtleUlEID09IDAKCQlpZiAoIGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgKSB7CgkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CgkJCWkgPSBDTlZfTElUVExFX1RPX1NIT1JUKCgoQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50a2lwX2tleV9pZF9pbmZvKTsKCQl9CgkJaWYgKCBpICYgVFhfS0VZICkgewkvKiBUeEtleUluZGljYXRvciA9PSAxCgkJCQkJCQkgICAoZWl0aGVyIHJlYWxseSBzZXQgYnkgTVNGIGluIGNhc2Ugb2YgREVGQVVMVCBvciBmYWtlZCBieSBIQ0YgaW4gY2FzZSBvZiBNQVBQRUQgKSAqLwoJCQlpZmJwLT5JRkJfTUlDVHhDbnRsID0gKGhjZl8xNikoIEhGU19UWF9DTlRMX01JQyB8IChpICYgS0VZX0lEICk8PDggKTsKCQkJaWZicC0+SUZCX01JQ1R4S2V5WzBdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSgga2V5X3AgKTsKCQkJaWZicC0+SUZCX01JQ1R4S2V5WzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzEpICk7CgkJfQoJCWkgPSAoIGkgJiBLRVlfSUQgKSAqIDI7CgkJaWZicC0+SUZCX01JQ1J4S2V5W2ldICAgPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMikgKTsKCQlpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCszKSApOwoJfQojZGVmaW5lIFAgKChDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCkKCWlmICggKCBsdHZwLT50eXAgPT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgKQl8fAoJCSAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKCQkgICAoIChpZmJwLT5JRkJfTUlDVHhDbnRsID4+IDgpICYgS0VZX0lEICkgPT0gQ05WX1NIT1JUX1RPX0xJVFRMRShQLT50a2lwX2tleV9pZCApCgkJICkKCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0JCS8vZGlzYWJsZSBNSUMtZW5naW5lCiN1bmRlZiBQCiB9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCglpZiAoIGx0dnAtPnR5cCA9PSBDRkdfUFJPRyApIHsKCQlyYyA9IGRvd25sb2FkKCBpZmJwLCAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopbHR2cCApOwoJfSBlbHNlIHN3aXRjaCAobHR2cC0+dHlwKSB7CiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KCSAgY2FzZSBDRkdfUkVHX0FTU0VSVF9SVE5QOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBNU0YgUm91dGluZXMKI2RlZmluZSBQICgoQ0ZHX1JFR19BU1NFUlRfUlROUF9TVFJDVCBGQVIgKilsdHZwKQoJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSBQLT5ydG5wOwovLwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IFAtPmx2bDsJCS8vVE9ETyBub3QgeWV0IHN1cHBvcnRlZCBzbyBkZWZhdWx0IGlzIHNldCBpbiBoY2ZfY29ubmVjdAoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjEgKSApCS8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKI3VuZGVmIFAKCQlicmVhazsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwoJICBjYXNlIENGR19SRUdfSU5GT19MT0c6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIExvZyBmaWx0ZXIKCQlpZmJwLT5JRkJfUklETG9ncCA9ICgoQ0ZHX1JJRF9MT0dfU1RSQ1QgRkFSKilsdHZwKS0+cmVjb3JkcDsKCQlicmVhazsKI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKCSAgY2FzZSBDRkdfQ05UTF9PUFQ6CQkJCQkJCQkJCQkJLy9vdmVycnVsZSBvcHRpb24KCQlIQ0ZBU1NFUlQoICggbHR2cC0+dmFsWzBdICYgfihVU0VfRE1BIHwgVVNFXzE2QklUKSApID09IDAsIGx0dnAtPnZhbFswXSApCgkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7CgkJaWZicC0+SUZCX0NudGxPcHQgfD0gIGx0dnAtPnZhbFswXSAmIFVTRV8xNkJJVDsKCQlicmVhazsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCSAgY2FzZSBDRkdfUkVHX01COgkJCQkJCQkJCQkJCQkvL1JlZ2lzdGVyIE1haWxCb3gKI2RlZmluZSBQICgoQ0ZHX1JFR19NQl9TVFJDVCBGQVIgKilsdHZwKQoJCUhDRkFTU0VSVCggKCAoaGNmXzMyKVAtPm1iX2FkZHIgJiAweDAwMDEgKSA9PSAwLCAoaGNmXzMyKVAtPm1iX2FkZHIgKQoJCUhDRkFTU0VSVCggKFApLT5tYl9zaXplID49IDYwLCAoUCktPm1iX3NpemUgKQoJCWlmYnAtPklGQl9NQnAgPSBQLT5tYl9hZGRyOwoJCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLwoJCWlmYnAtPklGQl9NQlNpemUgPSBpZmJwLT5JRkJfTUJwID09IE5VTEwgPyAwIDogUC0+bWJfc2l6ZTsKCQlpZmJwLT5JRkJfTUJXcCA9IGlmYnAtPklGQl9NQlJwCT0gMDsKCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsJCQkJCQkJCQkJCS8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQoJCWlmYnAtPklGQl9NQkluZm9MZW4gPSAwOwoJCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSA+PSA2MCB8fCBpZmJwLT5JRkJfTUJwID09IE5VTEwsIGlmYnAtPklGQl9NQlNpemUgKQojdW5kZWYgUAoJCWJyZWFrOwoJICBjYXNlIENGR19NQl9JTkZPOgkJCQkJCQkJCQkJCQkvL3N0b3JlIE1haWxCb3hJbmZvQmxvY2sKCQlyYyA9IHB1dF9pbmZvX21iKCBpZmJwLCAoQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICopbHR2cCApOwoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9NQgoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTklDX0FDQ0VTUwoJICBjYXNlIENGR19DTURfTklDOgojZGVmaW5lIFAgKChDRkdfQ01EX05JQ19TVFJDVCBGQVIgKilsdHZwKQoJCU9QVyggSFJFR19QQVJBTV8yLCBQLT5wYXJtMiApOwoJCU9QVyggSFJFR19QQVJBTV8xLCBQLT5wYXJtMSApOwoJCXJjID0gY21kX2V4ZSggaWZicCwgUC0+Y21kLCBQLT5wYXJtMCApOwoJCVAtPmhjZl9zdGF0ID0gKGhjZl8xNilyYzsKCQlQLT5zdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKCQlQLT5yZXNwMCA9IElQVyggSFJFR19SRVNQXzAgKTsKCQlQLT5yZXNwMSA9IElQVyggSFJFR19SRVNQXzEgKTsKCQlQLT5yZXNwMiA9IElQVyggSFJFR19SRVNQXzIgKTsKCQlQLT5pZmJfZXJyX2NtZCA9IGlmYnAtPklGQl9FcnJDbWQ7CgkJUC0+aWZiX2Vycl9xdWFsaWZpZXIgPSBpZmJwLT5JRkJfRXJyUXVhbGlmaWVyOwojdW5kZWYgUAoJCWJyZWFrOwoJICBjYXNlIENGR19DTURfSENGOgojZGVmaW5lIFAgKChDRkdfQ01EX0hDRl9TVFJDVCBGQVIgKilsdHZwKQoJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKCQlpZiAoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTICkgewoJCQlIQ0ZBU1NFUlQoIFAtPm1vZGUgPCBpZmJwLT5JRkJfSU9CYXNlLCBQLT5tb2RlICkJCS8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKCQkJT1BXKCBQLT5tb2RlLCBQLT5hZGRfaW5mbyk7CgkJfQojdW5kZWYgUAoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9OSUNfQUNDRVNTCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKICAgICAgY2FzZSBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTjoKICAgICAgICBpZmJwLT5JRkJfRndQZkJ1ZmYgPSAqKENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUKilsdHZwOwogICAgICAgIGJyZWFrOwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCgkgIGRlZmF1bHQ6CQkJCQkJLy9wYXNzIGV2ZXJ5dGhpbmcgdW5rbm93biBhYm92ZSB0aGUgIkZJRCIgcmFuZ2UgdG8gdGhlIEhlcm1lcyBvciBEb25nbGUKCQlyYyA9IHB1dF9pbmZvKCBpZmJwLCBsdHZwICk7Cgl9CgkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCS8qIDIwICovCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfUFVUX0lORk8gKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9wdXRfaW5mbwoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQoqLlBVUlBPU0UJCUFsbDogZGVjYXBzdWxhdGUgYSBtZXNzYWdlLgoqCQkJCXByZS1IZXJtZXNJSS41OiB2ZXJpZnkgTUlDLgoqCQkJCW5vbi1VU0IsIG5vbi1ETUEgbW9kZTogVHJhbnNmZXIgYSBtZXNzYWdlIGZyb20gdGhlIE5JQyB0byB0aGUgSG9zdCBhbmQgYWNrbm93bGVkZ2UgcmVjZXB0aW9uLgoqCQkJCVVTQjogVHJhbnNmb3JtIGEgbWVzc2FnZSBmcm9tIHByb3ByaWV0YXJ5IFVTQiBmb3JtYXQgdG8gODAyLjMgZm9ybWF0CioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglkZXNjcAkJUG9pbnRlciB0byB0aGUgRGVzY3JpcHRvciBMaXN0IGxvY2F0aW9uLgoqCW9mZnNldAkJVVNCOiBub3QgdXNlZAoqCQkJCW5vbi1VU0I6IHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhIHRvIGJlIG9idGFpbmVkICgwIGNvcnJlc3BvbmRzIHdpdGggRGVzdEFkZHIgZmllbGQKKgkJCQlvZiBmcmFtZSkuCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MJCQlObyBTU04gZXJyb3IgKCBvciBIQ0ZfRVJSX01JQyBhbHJlYWR5IHJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKKglIQ0ZfRVJSX01JQwkJCW1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAoIEhDRl9TVUNDRVNTIGlzIHJlcG9ydGVkIGlmIEhDRl9FUlJfTUlDIGlzIGFscmVhZHkKKgkJCQkJCXJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKKiAJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAoqIAlIQ0ZfRVJSX0RFRlVOQ1QuLi4KKgoqLkRFU0NSSVBUSU9OCiogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIE1TRiB0byBvYnRhaW4gdGhlIERhdGEgSW5mbyBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgdGhhdAoqIGlzIHJlcG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBieSB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24uCioKKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNvcGllcyB0aGUgbWVzc2FnZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgQ2FyZCBtZW1vcnkgaW50byBhIGJ1ZmZlciBzdHJ1Y3R1cmUKKiBwcm92aWRlZCBieSB0aGUgTVNGLgoqIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KKiBFeGVjdXRpb24gb2YgdGhlIFNlcnZpY2UgTklDIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5ldyBtZXNzYWdlLCBidXQgaXQgZGVmaW5pdGVseQoqIG1ha2VzIHRoZSBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZSBwcmVjZWRpbmcgU2VydmljZSBOSUMgZnVuY3Rpb24sIHVuYXZhaWxhYmxlLgoqCiogaW4gbm9uLVVTQi9ub24tRE1BIG1vZGUsIGhjZl9yY3ZfbXNnIHN0YXJ0cyB0aGUgY29weSBwcm9jZXNzIGF0IHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQgcmVxdWVzdGVkIGJ5IHRoZQoqIHBhcmFtZXRlciBvZmZzZXQsIHJlbGF0aXZlIHRvIEhGU19BRERSX0RFU1QsIGUuZyBvZmZzZXQgMCBzdGFydHMgY29weWluZyBmcm9tIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCB0aGUKKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCiogYnkgaGNmX3NlcnZpY2VfbmljIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yIGJlIGp1c3QgYmVoaW5kIGl0LCBpLmUuIHRoZSBmaXJzdCBieXRlIG5vdCB5ZXQgcmVhZC4KKiBXaGVuIG9mZnNldCBpcyB3aXRoaW4gbG9va2FoZWFkLCBkYXRhIGlzIGNvcGllZCBmcm9tIGxvb2thaGVhZC4KKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCiogb2Ygb2Zmc2V0CioKKi5OT1RJQ0U6CiogbyBhdCBlbnRyeTogbG9vayBhaGVhZCBidWZmZXIgYXMgcGFzc2VkIHdpdGggaGNmX3NlcnZpY2VfbmljIGlzIHN0aWxsIGFjY2Vzc2libGUgYW5kIHVuY2hhbmdlZAoqIG8gYXQgZXhpdDogUmVjZWl2ZSBGcmFtZSBpbiBOSUMgbWVtb3J5IGlzIHJlbGVhc2VkCioKKiBEZXNjcmlwdGlvbjoKKiBTdGFydGluZyBhdCB0aGUgYnl0ZSBpbmRpY2F0ZWQgYnkgdGhlIE9mZnNldCB2YWx1ZSwgdGhlIGJ5dGVzIGFyZSBjb3BpZWQgZnJvbSB0aGUgRGF0YSBJbmZvCiogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCiogaWRlbnRpZmllZCBieSBkZXNjcC4KKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgT2Zmc2V0IGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBvZiB0aGUgODAyLjMgZnJhbWUgcmVhZCBpbnRvIHRoZQoqIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cwoqIENvbnRyb2wgYW5kIDgwMi4xMSBmaWVsZHMpCiogSWYgT2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSwgY29weWluZyBzdGFydHMgZnJvbSB0aGUgbG9vayBhaGVhZCBidWZmZXIgdGlsbCB0aGUKKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAoqIFRoZW4gKG9yIGlmIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgT2Zmc2V0KSwgdGhlCiogbWVzc2FnZSBpcyBkaXJlY3RseSBjb3BpZWQgZnJvbSBOSUMgbWVtb3J5IHRvIEhvc3QgbWVtb3J5LgoqIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKKiB1bmRlZmluZWQuCiogQ29weWluZyBzdG9wcyBpZiBlaXRoZXI6CiogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCiogbyB0aGUgRGVzY3JpcHRvciB3aXRoIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkCioKKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAoqIEFzIGEgY29uc2VxdWVuY2UsIGhjZl9yY3ZfbXNnIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBhbnkgcGFydGljdWxhciBSeCBmcmFtZS4KKgoqIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKKiBvZiB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBtdXN0IGJlIHNldCBieSB0aGUgTVNGOgoqIG8gYnVmX2NudGwuYnVmX2RpbVsxXQoqIG8gKm5leHRfZGVzY19hZGRyCiogbyAqYnVmX2FkZHIKKiBBdCByZXR1cm4gZnJvbSBoY2ZfcmN2X21zZywgdGhlIGZpZWxkIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gb2YgdGhlIHVzZWQgRGVzY3JpcHRvcnMgcmVmbGVjdHMKKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgoqIE9uIHRoZSBsYXN0IHVzZWQgRGVzY3JpcHRvciwgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBsZXNzIG9yIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCiogT24gYWxsIHByZWNlZGluZyBEZXNjcmlwdG9ycyBidWZfY250bC5idWZfZGltWzBdIGlzIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCiogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KKiBOb3RlOiB0aGlzIEkvRiBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbnMgaG93IHRoZSBJL0YgbmVlZGVkIGZvciBQQ0kgQnVzIG1hc3RlcmluZyB3aWxsCiogYmUsIHNvIGl0IG1heSBjaGFuZ2UuCioKKiBUaGUgbW9zdCBsaWtlbHkgaGFuZGxpbmcgb2YgSENGX0VSUl9OT19OSUMgYnkgdGhlIE1TRiBpcyB0byBkcm9wIHRoZSBhbHJlYWR5IGNvcGllZAoqIGRhdGEgYXMgZWxlZ2FudGx5IGFzIHBvc3NpYmxlIHVuZGVyIHRoZSBjb25zdHJhaW50cyBhbmQgcmVxdWlyZW1lbnRzIHBvc2VkIGJ5IHRoZSAoTilPUy4KKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KKiBUaGlzIGVycm9yIGNvbnN0aXR1dGVzIGEgbG9naWMgZmxhdyBpbiB0aGUgTVNGCiogVGhlIEhDRiBjYW4gb25seSBjYXRjaCBhIG1pbm9yaXR5IG9mIHRoaXMKKiB0eXBlIG9mIGVycm9ycwoqIEJhc2VkIG9uIGNvbnNpc3RlbmN5IGlkZWFzLCB0aGUgSENGIGNhdGNoZXMgbm9uZSBvZiB0aGVzZSBlcnJvcnMuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQoqIC0gdGhlcmUgaXMgbm8gdW5hY2tub3dsZWRnZWQgUngtbWVzc2FnZSBhdmFpbGFibGUKKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCiogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgoqIC0gYW55IG9mIHRoZSBkZXNjcmlwdG9ycyBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqIAlhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKiAtIGJ5IHVzaW5nIHVuc2lnbmVkIGludCBhcyB0eXBlIGZvciBvZmZzZXQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cwoqIC0gQXNzZXJ0aW5nIG9uIGJlaW5nIGVuYWJsZWQvcHJlc2VudCBpcyBzdXBlcmZsdW91cywgc2luY2UgYSBub24temVybyBJRkJfbGFsIGltcGxpZXMgdGhhdCBoY2Zfc2VydmljZV9uaWMKKiAgIHdhcyBjYWxsZWQgYW5kIGRldGVjdGVkIGEgUngtbWVzc2FnZS4gQSB6ZXJvIElGQl9sYWwgd2lsbCBzZXQgdGhlIEJVRl9DTlQgZmllbGQgb2YgYXQgbGVhc3QgdGhlIGZpcnN0CiogICBkZXNjcmlwdG9yIHRvIHplcm8uCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCnsKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKd2NpX2J1ZnAJY3A7CQkJCQkJCQkJCS8vY2hhciBvcmllbnRlZCB3b3JraW5nIHBvaW50ZXIKaGNmXzE2CQlpOwppbnQJCQl0b3RfbGVuID0gaWZicC0+SUZCX1J4TGVuIC0gb2Zmc2V0OwkJLy90b3RhbCBsZW5ndGgKd2NpX2J1ZnAJbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsJCQkvL3N0YXJ0IGFkZHJlc3MgaW4gTG9va0FoZWFkIEJ1ZmZlcgpoY2ZfMTYJCWxhbCA9IGlmYnAtPklGQl9sYWwgLSBvZmZzZXQ7CQkJLy9hdmFpbGFibGUgZGF0YSB3aXRoaW4gTG9va0FoZWFkIEJ1ZmZlcgpoY2ZfMTYJCWo7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9SQ1ZfTVNHLCBvZmZzZXQgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBkZXNjcCwgSENGX1RSQUNFX1JDVl9NU0cgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4sIEhDRl9UUkFDRV9SQ1ZfTVNHICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuID49IG9mZnNldCwgTUVSR0VfMiggb2Zmc2V0LCBpZmJwLT5JRkJfUnhMZW4gKSApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9sYWwgPj0gb2Zmc2V0LCBvZmZzZXQgKQoJSENGQVNTRVJUKCAoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSA9PSAwLCAweERBREEgKQoKCWlmICggdG90X2xlbiA8IDAgKSB7CgkJbGFsID0gMDsgdG90X2xlbiA9IDA7CQkJCS8vc3VwcHJlc3MgYWxsIGNvcHlpbmcgYWN0aXZpdHkgaW4gdGhlIGRvLS13aGlsZSBsb29wCgl9CglkbyB7CQkJCQkJCQkJLy9sb29wIG92ZXIgYWxsIGF2YWlsYWJsZSBmcmFnbWVudHMKCQkvLyBvYm5veGlvdXMgaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQoJCWNwID0gZGVzY3AtPmJ1Zl9hZGRyOwoJCWogPSBtaW4oIChoY2ZfMTYpdG90X2xlbiwgZGVzY3AtPkJVRl9TSVpFICk7CS8vbWluaW11bSBvZiAid2hhdCdzYCBhdmFpbGFibGUiIGFuZCBmcmFnbWVudCBzaXplCgkJZGVzY3AtPkJVRl9DTlQgPSBqOwoJCXRvdF9sZW4gLT0gajsJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgdG8gZ28KCQlpZiAoIGxhbCApIHsJCQkJCQkvL2lmIGxvb2thaGVhZCBCdWZmZXIgbm90IHlldCBjb21wbGV0ZWx5IGNvcGllZAoJCQlpID0gbWluKCBsYWwsIGogKTsJCQkJLy9taW5pbXVtIG9mICJ3aGF0J3MgYXZhaWxhYmxlIiBpbiBMb29rQWhlYWQgYW5kIGZyYWdtZW50IHNpemUKCQkJbGFsIC09IGk7CQkJCQkJLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIGF2YWlsYWJsZSBpbiBMb29rQWhlYWQKCQkJaiAtPSBpOwkJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIGN1cnJlbnQgZnJhZ21lbnQKCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAoJCQkgKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzKi8KCQkJd2hpbGUgKCBpLS0gKSAqY3ArKyA9ICpsYXArKzsKCQl9CgkJaWYgKCBqICkgewkvL2lmIExvb2tBaGVhZCBCdWZmZXIgZXhoYXVzdGVkIGJ1dCBzdGlsbCBzcGFjZSBpbiBmcmFnbWVudCwgY29weSBkaXJlY3RseSBmcm9tIE5JQyBSQU0KCQkJZ2V0X2ZyYWcoIGlmYnAsIGNwLCBqIEJFX1BBUigwKSApOwoJCQlDQUxDX1JYX01JQyggY3AsIGogKTsKCQl9Cgl9IHdoaWxlICggKCBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCWlmICggaWZicC0+SUZCX1J4RklEICkgewoJCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CQkJCS8vcHJldmVudHMgTUlDIGVycm9yIHJlcG9ydCBpZiBoY2Zfc2VydmljZV9uaWMgYWxyZWFkeSBjb25zdW1lZCBhbGwKCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9SWF9BQ0sgKTsJCS8vb25seSAxIHNob3QgdG8gZ2V0IHRoZSBkYXRhLCBzbyBmcmVlIHRoZSByZXNvdXJjZXMgaW4gdGhlIE5JQwoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX1JDVl9NU0cgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9yY3ZfbXNnCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3NlbmRfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCiouUFVSUE9TRQkJRW5jYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBhcHBlbmQgcGFkZGluZyBhbmQgTUlDLgoqCQkJCW5vbi1VU0I6IFRyYW5zZmVycyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgZnJvbSBIb3N0IHRvIE5JQyBhbmQgaW5pdGlhdGVzIHRyYW5zbWlzc2lvbi4KKgkJCQlVU0I6IFRyYW5zZmVyIHJlc3VsdGluZyBtZXNzYWdlIGludG8gYSBmbGF0IGJ1ZmZlci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlwb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yTGlzdCBvciBOVUxMCioJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCioJCQkJCUhGU19UWF9DTlRMX1NQRUNUUkFMSU5LCioJCQkJCUhGU19UWF9DTlRMX1BSSU8KKgkJCQkJSEZTX1RYX0NOVExfVFhfT0sKKgkJCQkJSEZTX1RYX0NOVExfVFhfRVgKKgkJCQkJSEZTX1RYX0NOVExfVFhfREVMQVkKKgkJCQkJSEZTX1RYX0NOVExfVFhfQ09OVAoqCQkJCQlIQ0ZfUE9SVF8wCQkJCSBNQUMgUG9ydCAwIChkZWZhdWx0KQoqCQkJCQlIQ0ZfUE9SVF8xIChBUCBvbmx5KQkgTUFDIFBvcnQgMQoqCQkJCQlIQ0ZfUE9SVF8yIChBUCBvbmx5KQkgTUFDIFBvcnQgMgoqCQkJCQlIQ0ZfUE9SVF8zIChBUCBvbmx5KQkgTUFDIFBvcnQgMwoqCQkJCQlIQ0ZfUE9SVF80IChBUCBvbmx5KQkgTUFDIFBvcnQgNAoqCQkJCQlIQ0ZfUE9SVF81IChBUCBvbmx5KQkgTUFDIFBvcnQgNQoqCQkJCQlIQ0ZfUE9SVF82IChBUCBvbmx5KQkgTUFDIFBvcnQgNgoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9ERUZVTkNUXy4uCioJSENGX0VSUl9USU1FX09VVAoqCiouREVTQ1JJUFRJT046CiogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBlbWJvZGllcyAyIGZ1bmN0aW9uczoKKiBvIHRyYW5zZmVycyBhIG1lc3NhZ2UgKGluY2x1ZGluZyBNQUMgaGVhZGVyKSBmcm9tIHRoZSBwcm92aWRlZCBidWZmZXIgc3RydWN0dXJlIGluIEhvc3QgbWVtb3J5IHRvIHRoZSBUcmFuc21pdAoqIEZyYW1lIFN0cnVjdHVyZSAoVHhGUykgaW4gTklDIG1lbW9yeS4KKiBvIElzc3VlIGEgc2VuZCBjb21tYW5kIHRvIHRoZSBGL1cgdG8gYWN0dWFsbHkgdHJhbnNtaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBUeEZTLgoqCiogQ29udHJvbCBpcyBiYXNlZCBvbiB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIElGQl9Sc2NJbmQuCiogVGhlIFJlc291cmNlIEluZGljYXRvciBpcyBtYWludGFpbmVkIGJ5IHRoZSBIQ0YgYW5kIHNob3VsZCBvbmx5IGJlIGludGVycHJldGVkIGJ1dCBub3QgY2hhbmdlZCBieSB0aGUgTVNGLgoqIFRoZSBNU0YgbXVzdCBjaGVjayBJRkJfUnNjSW5kIHRvIGJlIG5vbi16ZXJvIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNhbGwgdG8gdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbi4KKiBXaGVuIG5vIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgTVNGIG11c3QgaGFuZGxlIHRoZSBxdWV1aW5nIG9mIHRoZSBUcmFuc21pdCBmcmFtZSBhbmQgY2hlY2sgdGhlCiogUmVzb3VyY2UgSW5kaWNhdG9yIHBlcmlvZGljYWxseSBhZnRlciBjYWxsaW5nIGhjZl9zZXJ2aWNlX25pYy4KKgoqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb25zIHRyYW5zZmVycyBhIG1lc3NhZ2UgdG8gTklDIG1lbW9yeSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgZGVzY3AuCiogQmVmb3JlIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaXMgaW52b2tlZCB0aGlzIHdheSwgdGhlIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkgbXVzdCBiZSBjaGVja2VkLgoqIElmIHRoZSBSZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLCBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gZXhlY3V0aW9uIG11c3QgYmUgcG9zdHBvbmVkIHVudGlsIGFmdGVyIHByb2Nlc3Npbmcgb2YKKiBhIG5leHQgaGNmX3NlcnZpY2VfbmljIGl0IGFwcGVhcnMgdGhhdCB0aGUgUmVzb3VyY2UgaGFzIGJlY29tZSBhdmFpbGFibGUuCiogVGhlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieSBkZXNjcCB0byB0aGUgTklDLgoqIENvcHlpbmcgc3RvcHMgaWYgYSBOVUxMIHBvaW50ZXIgaW4gdGhlIG5leHRfZGVzY19hZGRyIGZpZWxkIGlzIHJlYWNoZWQuCiogSGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIGJlY2F1c2UgdGhlIEYvVyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKiBJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKgoqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBGL1cgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgbWVkaXVtIHdoZW4gdGhlCiogSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBpcyBub3Qgc2V0LgoqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBub24tTlVMTCwgdGhlIG1lc3NhZ2UgYXMgcmVwcmVzZW50ZWQgYnkgZGVzY3AgaXMgc2VuZC4KKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgTlVMTCwgYW5kIGlmIHRoZSBwcmVjZWRpbmcgY2FsbCBvZiB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGhhZAoqIGEgbm9uLU5VTEwgZGVzY3AgYW5kIHRoZSBwcmVjZWRpbmcgY2FsbCBoYWQgdGhlIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0eF9jbnRsIHNldCwgdGhlbiB0aGUgbWVzc2FnZSBhcwoqIHJlcHJlc2VudGVkIGJ5IHRoZSBkZXNjcCBvZiB0aGUgcHJlY2VkaW5nIGNhbGwgaXMgc2VuZC4KKgoqIEhjZl9zZW5kX21zZyBzdXBwb3J0cyBlbmNhcHN1bGF0aW9uIChzZWUgSENGX0VOQ0FQKSBvZiBFdGhlcm5ldC1JSSBmcmFtZXMuCiogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIFRyYW5zbWl0IEZyYW1lIHN0cnVjdHVyZSBhcyBhbiA4MDIuMyBmcmFtZS4KKiBIY2Zfc2VuZF9tc2cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFuIDgwMi4zIGFuZCBhbiBFdGhlcm5ldC1JSSBmcmFtZSBieSBsb29raW5nIGF0IHRoZSBkYXRhIGxlbmd0aC90eXBlIGZpZWxkCiogb2YgdGhlIGZyYW1lLiBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMTUxNCwgdGhlIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gRXRoZXJuZXQtSUkKKiBmcmFtZSwgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgYW4gODAyLjMgZnJhbWUuCiogVG8gZWFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENGLCB0aGlzIHR5cGUvdHlwZSBmaWVsZCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLAoqIGkuZS4gdGhlIDFzdCBmcmFnbWVudCBtdXN0IGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IDE0ICh0byBjb250YWluIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW4vVHlwZSBmaWVsZCkuCiogQW4gRXRoZXJuZXQtSUkgZnJhbWUgaXMgZW5jYXBzdWxhdGVkIGJ5IGluc2VydGluZyBhIFNOQVAgaGVhZGVyIGJldHdlZW4gdGhlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIHRoZQoqIHR5cGUgZmllbGQuICBUaGlzIGluc2VydGlvbiBpcyB0cmFuc3BhcmVudCBmb3IgdGhlIE1TRi4KKiBUaGUgSENGIGNvbnRhaW5zIGEgZml4ZWQgdGFibGUgdGhhdCBzdG9yZXMgYSBudW1iZXIgb2YgdHlwZXMuIElmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHR5cGUvdHlwZSBmaWVsZAoqIG9jY3VycyBpbiB0aGlzIHRhYmxlLCBCcmlkZ2UgVHVubmVsIEVuY2Fwc3VsYXRpb24gaXMgdXNlZCwgb3RoZXJ3aXNlIFJGQzEwNDIgZW5jYXBzdWxhdGlvbiBpcyB1c2VkLgoqIEJyaWRnZSBUdW5uZWwgdXNlcwlBQSBBQSAwMyAwMCAwMCBGOCBhcyBTTkFQIGhlYWRlciwKKiBSRkMxMDQyIHVzZXMJQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCiogVGhlIHRhYmxlIGN1cnJlbnRseSBjb250YWluczoKKiAwIDB4ODBGMwlBcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQoqIDAgMHg4MTM3CUlQWAoqCiogVGhlIGFsZ29yaXRobSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDgwMi4zIGFuZCBFdGhlcm5ldC1JSSBmcmFtZXMgbGltaXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZnJhbWVzIG9mCiogODAyLjMgZnJhbWVzIHRvIDE1MTQgYnl0ZXMuCiogRW5jYXBzdWxhdGlvbiBjYW4gYmUgc3VwcHJlc3NlZCBieSBtZWFucyBvZiB0aGUgc3lzdGVtIGNvbnN0YW50IEhDRl9FTkNBUCwgZS5nLiB0byBzdXBwb3J0IHByb3ByaWV0YXJ5CiogcHJvdG9jb2xzIHdpdGggODAyLjMgbGlrZSBmcmFtZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gMTUxNCBieXRlcy4KKgoqIEluIGNhc2UgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKiBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcy4KKiBJbiBjYXNlIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGUgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgbm90CiogZGV0ZXJtaW5lZCBieSB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVtERVNDX0NOVExfQ05UXSBmaWVsZHMgb2YgdGhlIGRlc2Nfc3RyY3QncyBidXQgYnkKKiB0aGUgTGVuZ3RoIGZpZWxkIG9mIHRoZSA4MDIuMyBmcmFtZS4KKiBJZiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGFuZCB0aGUKKiA4MDIuMyBMZW5ndGggZmllbGQgdGhlIDgwMi4zIExlbmd0aCBmaWVsZCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgYnkgdGhlIE5JQyB3aGlsZQoqIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTUlDLCBoZW5jZSBhIG1pc21hdGNoCiogd2lsbCByZXN1bHQgaW4gTUlDIGVycm9ycyBvbiB0aGUgUmVjZWl2aW5nIHNpZGUuCiogQ3VycmVudGx5IHRoaXMgcHJvYmxlbSBpcyBmbGFnZ2VkIG9uIHRoZSBUcmFuc21pdCBzaWRlIGJ5IGFuIEFzc2VydC4KKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBvZiBlYWNoIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CiogbyBidWZfY250bC5idWZfZGltWzBdCiogbyAqbmV4dF9kZXNjX2FkZHIKKiBvICpidWZfYWRkcgoqCiogQWxsIGJpdHMgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGV4Y2VwdCBIRlNfVFhfQ05UTF9UWF9ERUxBWSBhbmQgdGhlIEhDRl9QT1JUIyBiaXRzIGFyZSBwYXNzZWQgdG8gdGhlIEYvVyB2aWEKKiB0aGUgSEZTX1RYX0NOVEwgZmllbGQgb2YgdGhlIFR4RlMuCioKKiBOb3RlIHRoYXQgaGNmX3NlbmRfbXNnIGRvZXMgbm90IGRldGVjdCBOSUMgYWJzZW5jZS4gIFRoZSBNU0YgaXMgc3VwcG9zZWQgdG8gaGF2ZSBpdHMgb3duIC1wbGF0Zm9ybSBkZXBlbmRlbnQtCiogd2F5IHRvIHJlY29nbml6ZSBjYXJkIHJlbW92YWwvaW5zZXJ0aW9uLgoqIFRoZSB0b3RhbCBzeXN0ZW0gbXVzdCBiZSByb2J1c3QgYWdhaW5zdCBjYXJkIHJlbW92YWwgYW5kIHRoZXJlIGlzIG5vIHByaW5jaXBhbCBkaWZmZXJlbmNlIGJldHdlZW4gY2FyZCByZW1vdmFsCioganVzdCBhZnRlciBoY2Zfc2VuZF9tc2cgcmV0dXJucyBidXQgYmVmb3JlIHRoZSBhY3R1YWwgdHJhbnNtaXNzaW9uIHRvb2sgcGxhY2Ugb3Igc29tZXRpbWUgZWFybGllci4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlCiogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgoqIC0gbm8gcmVzb3VyY2VzIGZvciBQSUYgYXZhaWxhYmxlLgoqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKgoqLkRJQUdSQU0KKjQ6CWZvciB0aGUgbm9ybWFsIGNhc2UgKGkuZS4gbm8gSEZTX1RYX0NOVExfVFhfREVMQVkgb3B0aW9uIGFjdGl2ZSksIGEgZmlkIGlzIGFjcXVpcmVkIHZpYSB0aGUKKglyb3V0aW5lIGdldF9maWQuICBJZiBubyBGSUQgaXMgYWNxdWlyZWQsIHRoZSByZW1haW5kZXIgaXMgc2tpcHBlZCB3aXRob3V0IGFuIGVycm9yIG5vdGlmaWNhdGlvbi4gIEFmdGVyCioJYWxsLCB0aGUgTVNGIGlzIG5vdCBzdXBwb3NlZCB0byBjYWxsIGhjZl9zZW5kX21zZyB3aGVuIG5vIFJlc291cmNlIGlzIGF2YWlsYWJsZS4KKjc6CVRoZSBDb250cm9sRmllbGQgb2YgdGhlIFR4RlMgaXMgd3JpdHRlbi4gIFNpbmNlIHB1dF9mcmFnIGNhbiBvbmx5IHJldHVybiB0aGUgZmF0YWwgRGVmdW5jdCBvciAiTm8gTklDIiwgdGhlCioJcmV0dXJuIHN0YXR1cyBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIHdoZW4gaXQgZmFpbHMsIGNtZF93YWl0IHdpbGwgZmFpbCBhcyB3ZWxsLiAgKHNlZSBhbHNvIHRoZSBub3RlIG9uIHRoZQoqCW5lZWQgZm9yIGEgcmV0dXJuIGNvZGUgYmVsb3cpLgoqCU5vdGUgdGhhdCBIRlNfVFhfQ05UTCBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgSC1JLCBILUkvU1NOIGFuZCBILUlJIGFuZCBIRlNfQUREUl9ERVNUIGhhcyBkaWZmZXJlbnQKKgl2YWx1ZXMgZm9yIEgtSSAocmVnYXJkbGVzcyBvZiBTU04pIGFuZCBILUlJLgoqCUJ5IHdyaXRpbmcgMTcsIDEgb3IgMiAoIGltcGx5aW5nIDE2LCAwIG9yIDEgZ2FyYmFnZSB3b3JkIGFmdGVyIEhGU19UWF9DTlRMKSB0aGUgQkFQIGp1c3QgZ2V0cyB0bwoqCUhGU19BRERSX0RFU1QgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSByZXNwZWN0aXZlbHkuCioxMDogaWYgbmVpdGhlciBlbmNhcHN1bGF0aW9uIG5vciBNSUMgY2FsY3VsYXRpb24gaXMgbmVlZGVkLCBzcGxpdHRpbmcgdGhlIGZpcnN0IGZyYWdtZW50IGluIHR3byBkb2VzIG5vdAoqCXJlYWxseSBoZWxwIGJ1dCBpdCBtYWtlcyB0aGUgZmxvdyBlYXNpZXIgdG8gZm9sbG93IHRvIGRvIG5vdCBvcHRpbWl6ZSBvbiB0aGlzIGRpZmZlcmVuY2UKKgoqCWhjZl9zZW5kX21zZyBjaGVja3Mgd2hldGhlciB0aGUgZnJhbWUgaXMgYW4gRXRoZXJuZXQtSUkgcmF0aGVyIHRoYW4gYW4gIm9mZmljaWFsIiA4MDIuMyBmcmFtZS4KKglUaGUgRS1JSSBjaGVjayBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaW4gdGhlIE1BQyBoZWFkZXIuIElmIHRoaXMgZmllbGQgaGFzIGEgdmFsdWUgbGFyZ2VyIHRoYW4KKgkxNTAwLCBFLUlJIGlzIGFzc3VtZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRlc3QgZmFpbHMgaWYgdGhlIGxlbmd0aC90eXBlIGZpZWxkIGlzIG5vdCBpbiB0aGUgZmlyc3QKKglkZXNjcmlwdG9yLiAgSWYgRS1JSSBpcyByZWNvZ25pemVkLCBhIFNOQVAgaGVhZGVyIGlzIGluc2VydGVkLiBUaGlzIFNOQVAgaGVhZGVyIHJlcHJlc2VudHMgZWl0aGVyIFJGQzEwNDIKKglvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgc3VwcG9ydCByb3V0aW5lIGhjZl9lbmNhcC4KKgoqLk5PVElDRQoqCWhjZl9zZW5kX21zZyBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIG9ubHkgc2VuZCBtZXNzYWdlcyBvbiBlbmFibGVkIHBvcnRzIGF0IHRoZSBNU0YgbGV2ZWwuCioJVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAoqCXByb2Nlc3NvciB1dGlsaXphdGlvbiBhbmQgYmVpbmcgc3RpbGwgYWNjZXB0YWJsZSByb2J1c3QgYXQgdGhlIFdDSSAhISEhIQoqCioJaGNmX3NlbmRfbXNnIGRvZXMgbm90IE5FRUQgYSByZXR1cm4gdmFsdWUgdG8gcmVwb3J0IE5JQyBhYnNlbmNlIG9yIHJlbW92YWwgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKKgloY2Zfc2VuZF9tc2coKSwgYmVjYXVzZSB0aGUgTVNGIGFuZCBoaWdoZXIgbGF5ZXJzIG11c3QgYmUgYWJsZSB0byBjb3BlIGFueXdheSB3aXRoIHRoZSBOSUMgYmVpbmcgcmVtb3ZlZAoqCWFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZygpIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZS4KKglUbyBhY2NvbW1vZGF0ZSB1c2VyIGV4cGVjdGF0aW9ucyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIHJlcG9ydCBOSUMgYWJzZW5jZS4KKglEZWZ1bmN0IGJsb2NrcyBhbGwgTklDIGFjY2VzcyBhbmQgd2lsbCAoYWxzbykgYmUgcmVwb3J0ZWQgb24gYSBudW1iZXIgb2Ygb3RoZXIgY2FsbHMuCioKKgloY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBIZXJtZXMgZG9lcyB0aGlzIHByb3RlY3Rpb24uCioJSW4gY2FzZSBvZiBhIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgdGhlIHN1cnBsdXMgd2hpY2ggZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXIgaXMgc2ltcGx5IGRyb3BwZWQuCioJTm90ZSB0aGF0IHRoaXMgcG9zc2libHkgcmVzdWx0cyBpbiB0aGUgdHJhbnNtaXNzaW9uIG9mIGluY29tcGxldGUgZnJhbWVzLgoqCioJQWZ0ZXIgc29tZSBkZWxpYmVyYXRpb24gd2l0aCBGL1cgdGVhbSwgaXQgaXMgZGVjaWRlZCB0aGF0IC0gYmVpbmcgaW4gdGhlIHR3aWxpZ2h0IHpvbmUgb2Ygbm90IGtub3dpbmcKKgl3aGV0aGVyIHRoZSBwcm9ibGVtIGF0IGhhbmQgaXMgYW4gTVNGIGJ1ZywgSENGIGJ1ZiwgRi9XIGJ1ZywgSC9XIG1hbGZ1bmN0aW9uIG9yIGV2ZW4gc29tZXRoaW5nIGVsc2UgLSB0aGVyZQoqCWlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCioJb3ZlciBieSB0aGUgRi9XIGFuZCBob3BlcyBmb3IgYW4gQWxsb2NhdGUgZXZlbnQgaW4gZHVlIHRpbWUKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmhjZl9zZW5kX21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQp7CmludAkJCXJjID0gSENGX1NVQ0NFU1M7CkRFU0NfU1RSQ1QJKnAgLyogPSBkZXNjcCovOwkJLy93b3JraW5nIHBvaW50ZXIKaGNmXzE2CQlsZW47CQkJCQkvLyB0b3RhbCBieXRlIGNvdW50CmhjZl8xNgkJaTsKCmhjZl8xNgkJZmlkID0gMDsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQgfHwgZGVzY3AgPT0gTlVMTCwgaWZicC0+SUZCX1JzY0luZCApCglIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQiApCgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRU5EX01TRywgdHhfY250bCApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCgkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAoJICogc28gc2tpcCAqLwoJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICkKI2lmIEhDRl9BU1NFUlQKewlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CglIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICkKfQojZW5kaWYgLy8gSENGX0FTU0VSVAoKCWlmICggZGVzY3AgKSBpZmJwLT5JRkJfVHhGSUQgPSAwOwkJCQkvL2NhbmNlbCBhIHByZS1wdXQgbWVzc2FnZQoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVFhfQ09OVAkJCQkvLyBDb250aW51b3VzIHRyYW5zbWl0IHRlc3QKCWlmICggdHhfY250bCA9PSBIRlNfVFhfQ05UTF9UWF9DT05UICkgewoJIAlmaWQgPSBnZXRfZmlkKGlmYnApOwoJIAlpZiAoZmlkICE9IDAgKSB7CgkJCQkJCQkJCQkJLy9zZXR1cCBCQVAgdG8gYmVnaW4gb2YgVHhGUwoJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fT1VUICk7CgkJCQkJCQkJCQkJLy9jb3B5IGFsbCB0aGUgZnJhZ21lbnRzIGluIGEgdHJhbnNwYXJlbnQgZmFzaGlvbgoJCSAJZm9yICggcCA9IGRlc2NwOyBwOyBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSB7CgkJCS8qIG9ibm94aW91cyB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIgKi8KCQkJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQoJCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOwoJCQl9CgkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9USEVTRVVTIHwgSENNRF9CVVNZIHwgSENNRF9TVEFSVFBSRUFNQkxFLCBmaWQgKTsKCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CgkJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOwoJCQl9CgkJfQoJCQkJCQkJCQkJCS8vIGVlbiBzbGVjaHQgdm9vcmJlZWxkIGRvZXQgZ29lZCB2b2xnZW4gOz8KCQlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKQoJCXJldHVybiByYzsKCX0KI2VuZGlmIC8vIEhDRl9FWFRfVFhfQ09OVAoJCQkJCQkJCQkvKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgcmVkdW5kYW50IGZvciBhIHByZS1wdXQgbWVzc2FnZQoJCQkJCQkJCQkgKiBidXQgbW92aW5nIGl0IGluc2lkZSB0aGUgImlmIGZpZCIgbG9naWMgbWFrZXMgdGhlIG1lcmdpbmcgd2l0aCB0aGUKCQkJCQkJCQkJICogVVNCIGZsb3cgYXdrd2FyZAoJCQkJCQkJCQkgKi8KI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCXR4X2NudGwgfD0gaWZicC0+SUZCX01JQ1R4Q250bDsKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJZmlkID0gaWZicC0+SUZCX1R4RklEOwoJaWYgKGZpZCA9PSAwICYmICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApIAkJLyogNCAqLwoJCQkvKiBza2lwIHRoZSBuZXh0IGNvbXBvdW5kIHN0YXRlbWVudCBpZjoKCQkJICAgLSBwcmUtcHV0IG1lc3NhZ2Ugb3IKCQkJICAgLSBubyBmaWQgYXZhaWxhYmxlICh3aGljaCBzaG91bGQgbmV2ZXIgb2NjdXIgaWYgdGhlIE1TRiBhZGhlcmVzIHRvIHRoZSBXQ0kpCgkJCSAqLwoJewkJLy8gdG8gbWF0Y2ggdGhlIGNsb3NpbmcgY3VybHkgYnJhY2tldCBvZiBhYm92ZSAiaWYiIGluIGNhc2Ugb2YgSENGX1RZUEVfVVNCCgkJCQkJCQkJCQkJLy9jYWxjdWxhdGUgdG90YWwgbGVuZ3RoIDs/IHN1cGVyZmx1b3VzIHVubGVzcyBDQ1ggb3IgRW5jYXBzdWxhdGlvbgoJCWxlbiA9IDA7CgkJcCA9IGRlc2NwOwoJCWRvIGxlbiArPSBwLT5CVUZfQ05UOyB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOwoJCXAgPSBkZXNjcDsKLy87PwlIQ0ZBU1NFUlQoIGxlbiA8PSBIQ0ZfTUFYX01TRywgbGVuICkKLyo3Ki8JKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIEhGU19UWF9DTlRMLCBJT19PVVQgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9UWF9ERUxBWQoJCUhDRkFTU0VSVCggKCBkZXNjcCAhPSBOVUxMICkgXiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApLCB0eF9jbnRsICkKCQlpZiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApIHsKCQkJdHhfY250bCAmPSB+SEZTX1RYX0NOVExfVFhfREVMQVk7CQkvLyEhSEZTX1RYX0NOVExfVFhfREVMQVkgbm8gbG9uZ2VyIGF2YWlsYWJsZQoJCQlpZmJwLT5JRkJfVHhGSUQgPSBmaWQ7CgkJCWZpZCA9IDA7CQkJCQkJCQkvLyEhZmlkIG5vIGxvbmdlciBhdmFpbGFibGUsIGJlIGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgY29kZQoJCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1RYX0RFTEFZCgkJT1BXKCBIUkVHX0RBVEFfMSwgdHhfY250bCApIDsKCQlPUFcoIEhSRUdfREFUQV8xLCAwICk7CiNpZiAhICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWCApCgkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICkKCQkJCQkJCQkJCQkvKiBhc3N1bWUgRGVzdEFkZHIvU3JjQWRkci9MZW4vVHlwZSBBTFdBWVMgY29udGFpbmVkIGluIDFzdCBmcmFnbWVudAoJCQkJCQkJCQkJCSAqIG90aGVyd2lzZSBsaWZlIGdldHMgdG9vIGN1bWJlcnNvbWUgZm9yIE1JQyBhbmQgRW5jYXBzdWxhdGlvbiAhISEhISEhIQoJCWlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsJYWx0ZXJuYXRpdmVseTogYWRkIGEgc2FmZXR5IGVzY2FwZSAhISEhISEhISEhISEgfQkqLwojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJQ0FMQ19UWF9NSUMoIE5VTEwsIC0xICk7CQkvL2luaXRpYWxpemUgTUlDCi8qMTAqLwlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7CS8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJQ0FMQ19UWF9NSUMoIHAtPmJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFICk7CQkvL01JQyBvdmVyIERBLCBTQQoJCUNBTENfVFhfTUlDKCBudWxsX2FkZHIsIDQgKTsJCS8vTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkJLy8hIWJlIGNhcmVmdWwgZG8gbm90IHVzZSBwb3NpdGl2ZSB0ZXN0IG9uIEhDRl9BQ1RfQ0NYX09GRiwgYmVjYXVzZSBJRkJfQ0tJUFN0YXQgaXMgaW5pdGlhbGx5IDAKCQlpZigoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PTiApIHx8CiAgICAgICAgICAgKChHRVRfQlVGX0NOVChwKSA+PSAyMCApICAgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzEyXSA9PSAweEFBKSAmJiAocC0+YnVmX2FkZHJbMTNdID09IDB4QUEpICYmCiAgICAgICAgICAgIChwLT5idWZfYWRkclsxNF0gPT0gMHgwMykgJiYgKHAtPmJ1Zl9hZGRyWzE1XSA9PSAweDAwKSAmJgogICAgICAgICAgICAocC0+YnVmX2FkZHJbMTZdID09IDB4NDApICYmIChwLT5idWZfYWRkclsxN10gPT0gMHg5NikgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE4XSA9PSAweDAwKSAmJiAocC0+YnVmX2FkZHJbMTldID09IDB4MDApKSkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBIQ0ZfREFTQV9TSVpFOwoKICAgICAgICAgICAgT1BXKCBIUkVHX0RBVEFfMSwgQ05WX1NIT1JUX1RPX0JJRyggbGVuIC0gaSApKTsKCiAgICAgICAgICAgIC8qIG5lZWQgdG8gc2VuZCBvdXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZnJhZ21lbnQgKi8KCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgR0VUX0JVRl9DTlQocCkgLSBpIEJFX1BBUigwKSApOwogICAgICAgIH0KICAgICAgICBlbHNlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQl7CgkJCQkJCQkJCQkJLy9pZiBlbmNhcHN1bGF0aW9uIG5lZWRlZAojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCQkJCQkJCQkJCS8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KCQkJaWYgKCAoIHNuYXBfaGVhZGVyW3NpemVvZihzbmFwX2hlYWRlciktMV0gPSBoY2ZfZW5jYXAoICZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApICkgIT0gRU5DX05PTkUgKSB7CgkJCQlPUFcoIEhSRUdfREFUQV8xLCBDTlZfRU5EX1NIT1JUKCBsZW4gKyAoc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIpIC0gKCAyKjYgKyAyICkgKSApOwoJCQkJCQkJCQkJCS8vd3JpdGUgc3BsaWNlIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJCQlwdXRfZnJhZyggaWZicCwgc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgQkVfUEFSKDApICk7CgkJCQlDQUxDX1RYX01JQyggc25hcF9oZWFkZXIsIHNpemVvZihzbmFwX2hlYWRlcikgKTsJLy9NSUMgb3ZlciA2IGJ5dGUgU05BUAoJCQkJaSA9IEhDRl9EQVNBX1NJWkU7CgkJCX0gZWxzZQojZW5kaWYgLy8gSENGX0VOQwoJCQl7CgkJCQlPUFcoIEhSRUdfREFUQV8xLCAqKHdjaV9yZWNvcmRwKSZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApOwoJCQkJaSA9IDE0OwoJCQl9CgkJCQkJCQkJCQkJLy9jb21wbGV0ZSAxc3QgZnJhZ21lbnQgc3RhcnRpbmcgd2l0aCBUeXBlIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJCXB1dF9mcmFnKCBpZmJwLCAmcC0+YnVmX2FkZHJbaV0sIHAtPkJVRl9DTlQgLSBpIEJFX1BBUigwKSApOwoJCQlDQUxDX1RYX01JQyggJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSApOwoJCX0KCQkJCQkJCQkJCQkvL2RvIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzIHdpdGggTUlDIGNhbGN1bGF0aW9uCgkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CgkJCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCgkJCSAqIHNvIHNraXAgKi8KCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCgkJCXB1dF9mcmFnKCBpZmJwLCBwLT5idWZfYWRkciwgcC0+QlVGX0NOVCBCRV9QQVIoMCkgKTsKCQkJQ0FMQ19UWF9NSUMoIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UICk7CgkJfQoJCQkJCQkJCQkJCS8vcGFkIG1lc3NhZ2UsIGZpbmFsaXplIE1JQyBjYWxjdWxhdGlvbiBhbmQgd3JpdGUgTUlDIHRvIE5JQwoJCXB1dF9mcmFnX2ZpbmFsaXplKCBpZmJwICk7Cgl9CglpZiAoIGZpZCApIHsKLyoxNiovCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9CVVNZIHwgSENNRF9UWCB8IEhDTURfUkVDTCwgZmlkICk7CgkJaWZicC0+SUZCX1R4RklEID0gMDsKCQkJLyogcHJvYmFibHkgdGhpcyAoaS5lLiBubyBSc2NJbmQgQU5EICJIUkVHX0VWX0FMTE9DIikgYXQgdGhpcyBwb2ludCBpbiB0aW1lIG9jY3VycyBzbyBpbmZyZXF1ZW50LAoJCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcwoJCQkgKiAib3B0aW1pemF0aW9uIiBjb2RlIGFuZCBoYW5kbGUgdGhhdCBhZGRpdGlvbmFsIGludGVycnVwdCBvbmNlIGluIGEgd2hpbGUKCQkJICovCi8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1Ci8qMjAqLwlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQl9Ci8vICNlbmRpZiAvLyBBTExPQ18xNQoJfQovLwlIQ0ZBU1NFUlQoIGxldmVsOjppZmJwLT5JRkJfUnNjSW5kLCBpZmJwLT5JRkJfUnNjSW5kICkKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX3NlbmRfbXNnCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQoqLlBVUlBPU0UJCVNlcnZpY2VzIChtb3N0KSBOSUMgZXZlbnRzLgoqCQkJCVByb3ZpZGVzIHJlY2VpdmVkIG1lc3NhZ2UKKgkJCQlQcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKiAgSW4gbm9uLURNQSBtb2RlOgoqCWJ1ZnAJCWFkZHJlc3Mgb2YgY2hhciBidWZmZXIsIHN1ZmZpY2llbnRseSBsYXJnZSB0byBob2xkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBSeEZTIHVwIHRocm91Z2ggSEZTX1RZUEUKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioJCQkJdmFsdWUgYmV0d2VlbiBIRlNfVFlQRSArIDIgYW5kIEhGU19BRERSX0RFU1QgKyBIQ0ZfTUFYX01TRwoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9NSUMJbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDIChvbmx5IGlmIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiBidWZwKQoqCiouREVTQ1JJUFRJT04KKgoqIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2sKKiAtIElGQl9SeExlbgkJCTAgb3IgRnJhbWUgc2l6ZS4KKiAtIElGQl9NQkluZm9MZW4JCTAgb3IgdGhlIEwtZmllbGQgb2YgdGhlIG9sZGVzdCBNQklCLgoqIC0gSUZCX1JzY0luZAoqIC0gSUZCX0hDRl9UYWxsaWVzCQl1cGRhdGVkIGlmIGEgY29ycmVzcG9uZGluZyBldmVudCBvY2N1cnJlZC4KKiAtIElGQl9OSUNfVGFsbGllcwkJdXBkYXRlZCBpZiBhIFRhbGx5IEluZm8gZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgTklDLgoqIC0gSUZCX0RtYVBhY2tldHMKKiAtIElGQl9UeEZzU3RhdAoqIC0gSUZCX1R4RnNTd1N1cAoqIC0gSUZCX0xpbmtTdGF0CQlyZWZsZWN0cyBuZXcgbGluayBzdGF0dXMgb3IgMHgwMDAwIGlmIG5vIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4Kb3IKKiAtIElGQl9MaW5rU3RhdAkJbGluayBzdGF0dXMsIDB4ODAwMCByZWZsZWN0cyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCioKKiBXaGVuIElGQl9NQkluZm9MZW4gaXMgbm9uLXplcm8sIGF0IGxlYXN0IG9uZSBNQklCIGlzIGF2YWlsYWJsZS4KKgoqIElGQl9SeExlbglyZWZsZWN0cyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIDgwMi4zIHZpZXcgKEluY2x1ZGluZyBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuZ3RoLAoqIGV4Y2x1ZGluZyBNSUMtcGFkZGluZywgTUlDIGFuZCBzdW0gY2hlY2spIG9mIGFjdGl2ZSBSeCBGcmFtZSBTdHJ1Y3R1cmUuIElmIG5vIFJ4IERhdGEgcyBhdmFpbGFibGUsIElGQl9SeExlbgoqIGVxdWFscyAweDAwMDAuCiogUmVwZWF0ZWQgZXhlY3V0aW9uIGNhdXNlcyB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJzZXF1ZW50bHkgcmVjZWl2ZWQKKiBtZXNzYWdlcywgaXJyZXNwZWN0aXZlIHdoZXRoZXIgYSBoY2ZfcmN2X21zZyBvciBoY2ZfYWN0aW9uKEhDRl9BQ1RfUlgpIGlzIHBlcmZvcm1lZCBpbiBiZXR3ZWVuLgoqCiogV2hlbiBJRkJfUnhMZW4gaXMgbm9uLXplcm8sIGEgUmVjZWl2ZWQgRnJhbWUgU3RydWN0dXJlIGlzIGF2YWlsYWJsZSB0byBiZSByb3V0ZWQgdG8gdGhlIHByb3RvY29sIHN0YWNrLgoqIFdoZW4gTW9uaXRvciBNb2RlIGlzIG5vdCBhY3RpdmUsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBlcnJvci1mcmVlIG5vbi1XTVAgZnJhbWUuCiogSW4gY2FzZSBvZiBNb25pdG9yIE1vZGUsIGl0IG1heSBhbHNvIGJlIGEgZnJhbWUgd2l0aCBhbiBlcnJvciBvciBhIFdNUCBmcmFtZS4KKiBFcnJvbmVvdXMgZnJhbWVzIGhhdmUgYSBub24temVybyBlcnJvci1zdWIgZmllbGQgaW4gdGhlIEhGU19TVEFUIGZpZWxkIGluIHRoZSBsb29rIGFoZWFkIGJ1ZmZlci4KKgoqIElmIGEgUmVjZWl2ZSBtZXNzYWdlIGlzIGF2YWlsYWJsZSBpbiBOSUMgUkFNLCB0aGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgaXMgKHBhcnRseSkgY29waWVkIGZyb20gdGhlIE5JQyB0bwoqIHRoZSBidWZmZXIgaWRlbnRpZmllZCBieSBidWZwLgoqIENvcHlpbmcgc3RvcHMgZWl0aGVyIGFmdGVyIGxlbiBieXRlcyBvciB3aGVuIHRoZSBjb21wbGV0ZSA4MDIuMyBmcmFtZSBpcyBjb3BpZWQuCiogRHVyaW5nIHRoZSBjb3B5aW5nIHRoZSBtZXNzYWdlIGlzIGRlY2Fwc3VsYXRlZCAoaWYgYXBwcm9wcmlhdGUpLgoqIElmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIpLAoqIHRoZSBmcmFtZSBpcyBhdXRvbWF0aWNhbGx5IEFDSydlZCB0byB0aGUgRi9XIGFuZCBzdGlsbCBhdmFpbGFibGUgdmlhIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBhbmQgaGNmX3Jjdl9tc2cuCiogT25seSBpZiB0aGUgZnJhbWUgaXMgcmVhZCBjb21wbGV0ZWx5IGJ5IGhjZl9zZXJ2aWNlX25pYywgaGNmX3NlcnZpY2VfbmljIGNoZWNrcyB0aGUgTUlDIGFuZCBzZXRzIHRoZSByZXR1cm4KKiBzdGF0dXMgYWNjb3JkaW5nbHkuICBJbiB0aGlzIGNhc2UsIGhjZl9yY3ZfbXNnIGRvZXMgbm90IGNoZWNrIHRoZSBNSUMuCioKKiBUaGUgTUlDIGNhbGN1bGF0aW9uIGFsZ29yaXRobSB3b3JrcyBtb3JlIGVmZmljaWVudCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBpcwoqIHN1Y2ggdGhhdCBpdCBmaXRzIGV4YWN0bHkgNCBuIGJ5dGVzIG9mIHRoZSA4MDIuMyBmcmFtZSwgaS5lLiBsZW4gPT0gSEZTX0FERFJfREVTVCArIDQqbi4KKgoqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBzdXBwb3J0cyB0aGUgTklDIGV2ZW50IHNlcnZpY2UgaGFuZGxpbmcgcHJvY2Vzcy4KKiBJdCBwZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9ucyB0byBzZXJ2aWNlIHRoZSBOSUMsIHN1Y2ggdGhhdCB0aGUgZXZlbnQgY2F1c2UgaXMgZWxpbWluYXRlZCBhbmQgcmVsYXRlZAoqIGluZm9ybWF0aW9uIGlzIHNhdmVkLgoqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBpcyBleGVjdXRlZCBieSB0aGUgTVNGIElTUiBvciBwb2xsaW5nIHJvdXRpbmUgYXMgZmlyc3Qgc3RlcCB0byBkZXRlcm1pbmUgdGhlIGV2ZW50CiogY2F1c2UocykuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBwZXJmb3JtIGFsbCBub3QgZGlyZWN0bHkgTklDIHJlbGF0ZWQgaW50ZXJydXB0IHNlcnZpY2UKKiBhY3Rpb25zLCBlLmcuIGluIGEgUEMgZW52aXJvbm1lbnQgdGhpcyBpbmNsdWRlcyBzZXJ2aWNpbmcgdGhlIFBJQywgYW5kIG1hbmFnaW5nIHRoZSBQcm9jZXNzb3IgSW50ZXJydXB0CiogRW5hYmxpbmcvRGlzYWJsaW5nLgoqIEluIGNhc2Ugb2YgYSBwb2xsZWQgYmFzZWQgc3lzdGVtLCB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbXVzdCBiZSBleGVjdXRlZCAiZnJlcXVlbnRseSIuCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIG1heSBoYXZlIHNpZGUgZWZmZWN0cyByZWxhdGVkIHRvIHRoZSBNYWlsYm94IGFuZCBSZXNvdXJjZSBJbmRpY2F0b3IgKElGQl9Sc2NJbmQpLgoqCiogaGNmX3NlcnZpY2VfbmljIHJldHVybnM6CiogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgTUJJQiAoSUZCX01CSW5mb0xlbikKKiAtIENoYW5nZXMgaW4gdGhlIGxpbmsgc3RhdHVzIChJRkJfTGlua1N0YXQpCiogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKElGQl9SeExlbikKKiAtIHVwZGF0ZWQgSUZCX1JzY0luZAoqIC0gVXBkYXRlZCBUYWxsaWVzCioKKiBoY2Zfc2VydmljZV9uaWMgaXMgcHJlc3VtZWQgdG8gbmVpdGhlciBpbnRlcnJ1cHQgb3RoZXIgSENGLXRhc2tzIG5vciB0byBiZSBpbnRlcnJ1cHRlZCBieSBvdGhlciBIQ0YtdGFza3MuCiogQSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIHByZWNlZGUgaGNmX3NlcnZpY2VfbmljIGFzIHdlbGwgYXMgYWxsIG90aGVyIEhDRi10YXNrcyB3aXRoIGEgY2FsbCB0bwoqIGhjZl9hY3Rpb24gdG8gZGlzYWJsZSB0aGUgY2FyZCBpbnRlcnJ1cHRzIGFuZCwgYWZ0ZXIgYWxsIHdvcmsgaXMgY29tcGxldGVkLCB3aXRoIGEgY2FsbCB0byBoY2ZfYWN0aW9uIHRvCiogcmVzdG9yZSAod2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIGVuYWJsaW5nKSB0aGUgY2FyZCBpbnRlcnJ1cHRzLgoqIEluIGNhc2Ugb2YgYSBwb2xsZWQgZW52aXJvbm1lbnQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgTVNGIHByb2dyYW1tZXIgaXMgc3VmZmljaWVudGx5IGZhbWlsaWFyIHdpdGggdGhlCiogc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcnJ1cHQgc3RyYXRlZ3kgdG8gYSBwb2xsZWQgc3RyYXRlZ3kuCioKKiBoY2Zfc2VydmljZV9uaWMgc2VydmljZXMgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgoqIC0gSFJFR19FVl9JTkZPCQlBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKKiAtIEhSRUdfRVZfSU5GT19EUk9QCVdNQUMgZGlkIG5vdCBoYXZlIHN1ZmZpY2llbnQgUkFNIHRvIGJ1aWxkIFVuc29saWNpdGVkIEluZm9ybWF0aW9uIEZyYW1lCiogLSBIUkVHX0VWX1RYX0VYQwkJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9FWFRfSU5UX1RYX0VYIGJpdCBvZiBIQ0ZfRVhUKQoqIC0gSFJFR19FVl9TTEVFUF9SRVEJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQoqICoqIGluIG5vbl9ETUEgbW9kZQoqIC0gSFJFR19FVl9BTExPQwkJQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZCB3aGlsZSBvdXQgb2YgcmVzb3VyY2VzIGF0CiogCQkJCQkJY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2cvbm90aWZ5CiogLSBIUkVHX0VWX1JYCQkJdGhlIGRldGVjdGlvbiBvZiB0aGUgYXZhaWxhYmlsaXR5IG9mIHJlY2VpdmVkIG1lc3NhZ2VzCiogCQkJCQkJaW5jbHVkaW5nIFdhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbCAoV01QKSBtZXNzYWdlIHByb2Nlc3NpbmcKKiAqKiBpbiBETUEgbW9kZQoqIC0gSFJFR19FVl9SRE1BRAoqIC0gSFJFR19FVl9URE1BRAoqISEgaGNmX3NlcnZpY2VfbmljIGRvZXMgbm90IHNlcnZpY2UgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgoqISEgCUhSRUdfRVZfVFggCQkJKHRoZSAiT0siIFR4IEV2ZW50KSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBXQ0ksIGlmIGl0IG9jY3VycyBpdCBpcyB1bmNsZWFyCiohISAJCQkJCQl3aGF0IHRoZSBjYXVzZSBpcywgc28gbm8gbWVhbmluZ2Z1bCBzdHJhdGVneSBpcyBhdmFpbGFibGUuIE5vdCBhY2tpbmcgdGhlIGJpdCBpcwoqISEgCQkJCQkJcHJvYmFibHkgdGhlIGJlc3QgaGVscCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUgZGVidWdnZXIuCiohISAJSFJFR19FVl9DTUQJCQloYW5kbGVkIGluIGNtZF93YWl0LgoqISEgCUhSRUdfRVZfRldfRE1BIAkJKGkuZS4gSFJFR19FVl9SWERNQSwgSFJFR19FVl9UWERNQSBhbmRfRVZfTFBFU0MpIGFyZSBlaXRoZXIgbm90IHVzZWQgb3IgdXNlZAoqISEgCQkJCQkJYmV0d2VlbiB0aGUgRi9XIGFuZCB0aGUgRE1BIGVuZ2luZS4KKiEhIAlIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgb25seSBhcHBsaWNhYmxlIGZvciBILUlJIChpLmUuIG5vdCBISUkuNSBhbmQgdXAsIHNlZSBEQVdBKQoqCioJSWYsIGluIG5vbi1ETUEgbW9kZSwgYSBSeCBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgaXRzIGxlbmd0aCBpcyByZWZsZWN0ZWQgYnkgdGhlIElGQl9SeExlbiBmaWVsZCBvZiB0aGUgSUZCLgoqCVRoaXMgbGVuZ3RoIHJlZmxlY3RzIHRoZSBkYXRhIGl0c2VsZiBhbmQgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBEYXRhTGVuZ3RoL1R5cGUgZmllbGQKKglidXQgbm90IHRoZSBTTkFQLWhlYWRlciBpbiBjYXNlIG9mIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRi4gIElmIG5vIG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBJRkJfUnhMZW4gaXMKKgl6ZXJvLiAgRm9ybWVyIHZlcnNpb25zIG9mIHRoZSBIQ0YgaGFuZGxlZCBXTVAgbWVzc2FnZXMgYW5kIHN1cHBvcnRlZCBhICJtb25pdG9yIiBtb2RlIGluIGhjZl9zZXJ2aWNlX25pYywKKgl3aGljaCBkZXBvc2l0ZWQgY2VydGFpbiBvciBhbGwgUnggbWVzc2FnZXMgaW4gdGhlIE1haWxCb3guIFRoZSByZXNwb25zaWJpbGl0eSB0byBoYW5kbGUgdGhlc2UgZnJhbWVzIGlzCioJbW92ZWQgdG8gdGhlIE1TRi4gVGhlIEhDRiBvZmZlcnMgYXMgc3VwcG9ydHMgaGNmX3B1dF9pbmZvIHdpdGggQ0ZHX01CX0lORk8gYXMgcGFyYW1ldGVyIHRvIGVtdWxhdGUgdGhlIG9sZAoqIAlpbXBsZW1lbnRhdGlvbiB1bmRlciBjb250cm9sIG9mIHRoZSBNU0YuCioKKiAqKlJ4IEJ1ZmZlciBmcmVlIHN0cmF0ZWd5CioJV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CioJbWVhbnMgb2YgaGNmX3Jjdl9tc2cuIEl0IG11c3QgYmUgcHJldmVudGVkIHRoYXQgdGhlIExBTiBDb250cm9sbGVyIHdyaXRlcyBuZXcgZGF0YSBpbiB0aGUgTklDIGJ1ZmZlcgoqCWJlZm9yZSB0aGUgTVNGIGlzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIE5JQyBidWZmZXIgaXMgcmV0dXJuZWQgdG8gdGhlIExBTiBDb250cm9sbGVyCioJd2hlbjoKKgkgLSB0aGUgY29tcGxldGUgZnJhbWUgZml0cyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvcgoqCSAtIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCBvcgoqCSAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgoqCSAtIGhjZl9zZXJ2aWNlX25pYyBpcyBjYWxsZWQgYWdhaW4KKglJdCBjYW4gYmUgcmVhc29uZWQgdGhhdCBoY2ZfYWN0aW9uKCBJTlRfT04gKSBzaG91bGQgbm90IGJlIGdpdmVuIGJlZm9yZSB0aGUgTVNGIGhhcyBjb21wbGV0ZWx5IHByb2Nlc3NlZAoqCWEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQoqCU1TRiBpcyBwcm9jZXNzaW5nIGEgUngtZnJhbWUsIGhlbmNlIHRoZSBSeC1ldmVudCBiaXQgaW4gdGhlIEhlcm1lcyByZWdpc3RlciBtdXN0IGJlIGFjdGl2ZSkuIFRoaXMKKglpbnRlcnJ1cHQgd2lsbCBjYXVzZSBoY2Zfc2VydmljZV9uaWMgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhY2staW5nIG9mIHRoZSAibGFzdCIgUngtZXZlbnQKKgl0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaXMgemVybyBvciBvdGhlciByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KKiAtIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCioJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCioKKgoqLkRJQUdSQU0KKjE6CUlGQl9MaW5rU3RhdCBpcyBjbGVhcmVkLCBpZiBhIExpbmtTdGF0dXMgZnJhbWUgaXMgcmVjZWl2ZWQsIElGQl9MaW5rU3RhdCB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkKKglieSBpc3JfaW5mby4Kb3IKKjE6CUlGQl9MaW5rU3RhdCBjaGFuZ2UgaW5kaWNhdGlvbiBpcyBjbGVhcmVkLiBJZiBhIExpbmtTdGF0dXMgZnJhbWUgaXMgcmVjZWl2ZWQsIElGQl9MaW5rU3RhdCB3aWxsIGJlIHVwZGF0ZWQKKglhY2NvcmRpbmdseSBieSBpc3JfaW5mby4KKjI6IElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBOSUMgcHJlc2VuY2UgY2hlY2sgb3RoZXJ3aXNlOgoqCSAtCXRoaXMgdmFsdWUgbWF5IHN0YXkgbm9uLXplcm8gaWYgdGhlIE5JQyBpcyBwdWxsZWQgb3V0IGF0IGFuIGluY29udmVuaWVudCBtb21lbnQuCioJIC0JdGhlIFJ4QWNrIG9uIGEgemVyby1GSUQgbmVlZHMgYSB6ZXJvLXZhbHVlIGZvciBJRkJfUnhMZW4gdG8gd29yawoqCSBOb3RlIHRoYXQgYXMgc2lkZS1lZmZlY3Qgb2YgdGhlIGhjZl9hY3Rpb24gY2FsbCwgdGhlIHJlbWFpbmRlciBvZiBSeCByZWxhdGVkIGluZm8gaXMgcmUtaW5pdGlhbGl6ZWQgYXMKKgkgd2VsbC4KKjQ6CUluIGNhc2Ugb2YgRGVmdW5jdCBtb2RlLCB0aGUgaW5mb3JtYXRpb24gc3VwcGxpZWQgYnkgSGVybWVzIGlzIHVucmVsaWFibGUsIHNvIHRoZSBib2R5IG9mCioJaGNmX3NlcnZpY2VfbmljIGlzIHNraXBwZWQuIFNpbmNlIGhjZl9jbnRsIHR1cm5zIGludG8gYSBOT1AgaWYgUHJpbWFyeSBvciBTdGF0aW9uIEYvVyBpcyBpbmNvbXBhdGlibGUsCioJaGNmX3NlcnZpY2VfbmljIGlzIGFsc28gc2tpcHBlZCBpbiB0aG9zZSBjYXNlcy4KKglUbyBwcmV2ZW50IHRoYXQgaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgYm9ndXMgaW5mb3JtYXRpb24gdG8gdGhlIE1TRiB3aXRoIGFsbCAtIHBvc3NpYmx5IGRpZmZpY3VsdCB0bwoqCWRlYnVnIC0gdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzLCBpdCBpcyBwYXJhbW91bnQgdG8gY2hlY2sgdGhlIE5JQyBwcmVzZW5jZS4gSW4gZm9ybWVyIGRheXMgdGhlIHByZXNlbmNlCioJdGVzdCB3YXMgYmFzZWQgb24gdGhlIEhlcm1lcyByZWdpc3RlciBIUkVHX1NXXzAuIFNpbmNlIGluIEhDRl9BQ1RfSU5UX09GRiBpcyBjaG9zZW4gZm9yIHN0cmF0ZWd5IGJhc2VkIG9uCioJSFJFR19FVl9TVEFULCB0aGlzIGlzIG5vdyBhbHNvIHVzZWQgaW4gaGNmX3NlcnZpY2VfbmljLiBUaGUgbW90aXZhdGlvbiB0byBjaGFuZ2Ugc3RyYXRlZ3kgaXMgcGFydGx5CioJZHVlIHRvIGluY29uc2lzdGVudCBGL1cgaW1wbGVtZW50YXRpb25zIHdpdGggcmVzcGVjdCB0byBIUkVHX1NXXzAgbWFuaXB1bGF0aW9uIGFyb3VuZCByZXNldCBhbmQgZG93bmxvYWQuCioJTm90ZSB0aGF0IGluIHBvbGxlZCBlbnZpcm9ubWVudHMgQ2FyZCBSZW1vdmFsIGlzIG5vdCBkZXRlY3RlZCBieSBJTlRfT0ZGIHdoaWNoIG1ha2VzIHRoZSBjaGVjayBpbgoqCWhjZl9zZXJ2aWNlX25pYyBldmVuIG1vcmUgaW1wb3J0YW50LgoqODoJVGhlIGV2ZW50IHN0YXR1cyByZWdpc3RlciBvZiB0aGUgSGVybWVzIGlzIHNhbXBsZWQKKglUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uCioJIC0gSFJFR19FVl9JTkZPX0RST1AgaXMgZXhwbGljaXRseSBleGNsdWRlZCBmcm9tIHRoZSBhY2NlcHRhYmxlIEhSRUdfRVZfU1RBVCBiaXRzIGJlY2F1c2UgaXQgaW5kaWNhdGVzCioJICAgYSB0b28gaGVhdmlseSBsb2FkZWQgc3lzdGVtLgoqCSAtIEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCioKKgoqCUhSRUdfRVZfVFhfRVhDIGlzIGFjY2VwdGVkICh2aWEgSFJFR19FVl9UWF9FWFQpIGlmIGFuZCBvbmx5IGlmIEhDRl9FWFRfSU5UX1RYX0VYIHNldCBpbiB0aGUgSENGX0VYVAoqCWRlZmluaXRpb24gYXQgY29tcGlsZSB0aW1lLgoqCVRoZSBmb2xsb3dpbmcgYWN0aXZpdGllcyBhcmUgaGFuZGxlZDoKKgkgLQlBbGxvYyBldmVudHMgYXJlIGhhbmRsZWQgYnkgaGNmX3NlbmRfbXNnIChhbmQgbm90aWZ5KS4gT25seSBpZiB0aGVyZSBpcyBubyAic3BhcmUiIHJlc291cmNlLCB0aGUKKgkJYWxsb2MgZXZlbnQgaXMgc3VwZXJmaWNpYWxseSBzZXJ2aWNlZCBieSBoY2Zfc2VydmljZV9uaWMgdG8gY3JlYXRlIGEgcHNldWRvLXJlc291cmNlIHdpdGggdmFsdWUKKgkJMHgwMDEuIFRoaXMgdmFsdWUgaXMgcmVjb2duaXplZCBieSBnZXRfZmlkIChjYWxsZWQgYnkgaGNmX3NlbmRfbXNnIGFuZCBub3RpZnkpIHdoZXJlIHRoZSByZWFsCioJCVR4RmlkIGlzIHJldHJpZXZlZCBhbmQgdGhlIEhlcm1lcyBpcyBhY2tlZCBhbmQgLSBob3BlZnVsbHkgLSB0aGUgIm5vcm1hbCIgY2FzZSB3aXRoIGEgc3BhcmUgVHhGaWQKKgkJaW4gSUZCX1JzY0luZCBpcyByZXN0b3JlZC4KKgkgLQlJbmZvIGRyb3AgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IGluY3JlbWVudGluZyBhIHRhbGx5CioJIC0JTGlua0V2ZW50IChpbmNsdWRpbmcgc29saWNpdGVkIGFuZCB1bnNvbGljaXRlZCB0YWxsaWVzKSBhcmUgaGFuZGxlZCBieSBwcm9jZWR1cmUgaXNyX2luZm8uCioJLQlUeEV4IChpZiBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWUpIGlzIGhhbmRsZWQgYnkgY29weWluZyB0aGUgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgVHhGUwoqCQlpbnRvIHRoZSBJRkIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSB0aGUgTVNGLgoqCQlOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgoqCU5vdGUsIHRoZSBBY2sgb2YgYWxsIG9mIGFib3ZlIGV2ZW50cyBpcyBoYW5kbGVkIGF0IHRoZSBlbmQgb2YgaGNmX3NlcnZpY2VfbmljCioxNjogSW4gY2FzZSBvZiAgbm9uLURNQSAoIGVpdGhlciBub3QgY29tcGlsZWQgaW4gb3IgZHVlIHRvIGEgcnVuLXRpbWUgY2hvaWNlKToKKglJZiBhbiBSeC1mcmFtZSBpcyBhdmFpbGFibGUsIGZpcnN0IHRoZSBGSUQgb2YgdGhhdCBmcmFtZSBpcyByZWFkLCBpbmNsdWRpbmcgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUKKgl6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4gTm90ZSB0aGF0IHN1Y2ggYSB6ZXJvLUZJRCBpcyBhY2tub3dsZWRnZWQgYXQgdGhlIGVuZCBvZgoqCWhjZl9zZXJ2aWNlX25pYyBhbmQgdGhhdCB0aGlzIGRlcGVuZHMgb24gdGhlIElGQl9SeExlbiBpbml0aWFsaXphdGlvbiBpbiB0aGUgYmVnaW4gb2YgaGNmX3NlcnZpY2VfbmljLgoqCVRoZSBBc3NlcnQgdmFsaWRhdGVzIHRoZSBIQ0YgYXNzdW1wdGlvbiBhYm91dCBIZXJtZXMgaW1wbGVtZW50YXRpb24gdXBvbiB3aGljaCB0aGUgcmFuZ2Ugb2YKKglQc2V1ZG8tUklEcyBpcyBiYXNlZC4KKglUaGVuIHRoZSBjb250cm9sIGZpZWxkcyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIDgwMi4zIGZyYW1lIGFyZSByZWFkIGZyb20gdGhlIE5JQyBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgoqCVRoZSBzdGF0dXMgZmllbGQgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCioJVGhlIGxlbmd0aCBpcywgYWZ0ZXIgaW1wbGljaXQgRW5kaWFuZXNzIGNvbnZlcnNpb24gaWYgbmVlZGVkLCBhbmQgYWRqdXN0bWVudCBmb3IgdGhlIDE0IGJ5dGVzIG9mIHRoZQoqCTgwMi4zIE1BQyBoZWFkZXIsIHN0b3JlZCBpbiBJRkJfUnhMZW4uCioJSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBUT1RBTCBsZW5ndGggb2YgMTQgYXJlIHJlY2VpdmVkLCBzbyB3aXRob3V0IHRoaXMKKglsZW5ndGggYWRqdXN0bWVudCwgSUZCX1J4TGVuIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGZyYW1lcyBmcm9tICJubyBmcmFtZSIuCioJTm8gTUlDIGNhbGN1bGF0aW9uIHByb2Nlc3NlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkaW5nIG9mIHRoZXNlIENvbnRyb2wgZmllbGRzLgoqMjY6IFRoaXMgbGVuZ3RoIHRlc3QgZmVlbHMgbGlrZSBzdXBlcmZsdW91cyByb2J1c3RuZXNzIGFnYWluc3QgbWFsZm9ybWVkIGZyYW1lcywgYnV0IGl0IHR1cm5lZCBvdXQgdG8gYmUKKgluZWVkZWQgaW4gdGhlIHJlYWwgKGhvc3RpbGUpIHdvcmxkLgoqCVRoZSBkZWNhcHN1bGF0aW9uIGNoZWNrIG5lZWRzIHN1ZmZpY2llbnQgZGF0YSB0byByZXByZXNlbnQgREEsIFNBLCBMLCBTTkFQIGFuZCBUeXBlIHdoaWNoIGFtb3VudHMgdG8KKgkyMiBieXRlcy4gSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBzbWFsbGVyIGxlbmd0aCBhcmUgcmVjZWl2ZWQuIFRvIHByZXZlbnQKKgl0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGhheXdpcmUsIGEgY2hlY2sgb24gdGhlIGxlbmd0aCBpcyBuZWVkZWQuCioJVGhlIGFjdHVhbCBkZWNhcHN1bGF0aW9uIHRha2VzIHBsYWNlIG9uIHRoZSBmbHkgaW4gdGhlIGNvcHlpbmcgcHJvY2VzcyBieSBvdmVyd3JpdGluZyB0aGUgU05BUCBoZWFkZXIuCioJTm90ZSB0aGF0IGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiB0aGUgU05BUCBoZWFkZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgTVNGLCBoZW5jZSBJRkJfUnhMZW4gbXVzdCBiZQoqCWNvbXBlbnNhdGVkIGZvciB0aGUgU05BUCBoZWFkZXIgbGVuZ3RoLgoqCVRoZSAyMiBieXRlcyBuZWVkZWQgZm9yIGRlY2Fwc3VsYXRpb24gYXJlIChtb3JlIHRoYW4pIHN1ZmZpY2llbnQgZm9yIHRoZSBleGNlcHRpb25hbCBoYW5kbGluZyBvZiB0aGUKKglNSUMgYWxnb3JpdGhtIG9mIHRoZSBMLWZpZWxkIChyZXBsYWNpbmcgdGhlIDIgYnl0ZSBMLWZpZWxkIHdpdGggNCAweDAwIGJ5dGVzKS4KKjMwOiBUaGUgMTIgaW4gdGhlIG5vLVNTTiBicmFuY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgZ2V0X2ZyYWcsIHRoZSAyIHdpdGggdGhlIElQVyBvZiB0aGUgU1NOIGJyYW5jaAoqMzI6IElmIEhlcm1lcyByZXBvcnRlZCBNSUMtcHJlc2VuY2UsIHRoYW4gdGhlIE1JQyBlbmdpbmUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbm9uLWR1bW15IE1JQyBjYWxjdWxhdGlvbgoqCXJvdXRpbmUgYWRkcmVzcyBhbmQgYXBwcm9wcmlhdGUga2V5LgoqMzQ6IFRoZSA4IGJ5dGVzIGFmdGVyIHRoZSBEQSwgU0EsIEwgYXJlIHJlYWQgYW5kIGl0IGlzIGNoZWNrZWQgd2hldGhlciBkZWNhcHN1bGF0aW9uIGlzIG5lZWRlZCBpLmUuOgoqCSAgLSB0aGUgSGVybWVzIHJlcG9ydGVkIFR1bm5lbCBlbmNhcHN1bGF0aW9uIG9yCioJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgMTA0MiBFbmNhcHN1bGF0aW9uIGFuZCBoY2ZfZW5jYXAgcmVwb3J0cyB0aGF0IHRoZSBIQ0Ygd291bGQgbm90IGhhdmUgdXNlZAoqCQkxMDQyIGFzIHRoZSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbQoqCU5vdGUgdGhhdCB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIFJ4RlMgaW4gYnVmcCBoYXMgTmF0aXZlIEVuZGlhbmVzcyBkdWUgdG8gdGhlIGNvbnZlcnNpb24gZG9uZSBieSB0aGUKKglCRV9QQVIgaW4gZ2V0X2ZyYWcuCiozNjogVGhlIFR5cGUgZmllbGQgaXMgdGhlIG9ubHkgd29yZCBrZXB0IChhZnRlciBtb3ZpbmcpIG9mIHRoZSBqdXN0IHJlYWQgOCBieXRlcywgaXQgaXMgbW92ZWQgdG8gdGhlCioJTC1maWVsZC4gIFRoZSBvcmlnaW5hbCBMLWZpZWxkIGFuZCA2IGJ5dGUgU05BUCBoZWFkZXIgYXJlIGRpc2NhcmRlZCwgc28gSUZCX1J4TGVuIGFuZCBidWZfYWRkciBtdXN0CioJYmUgYWRqdXN0ZWQgYnkgOC4KKjQwOiBEZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGZyYW1lIChzdGFydGluZyB3aXRoIERBKSBmaXRzIGluIHRoZSBMb29rYWhlYWQgYnVmZmVyLCB0aGVuIHJlYWQgdGhlIG5vdC15ZXQKKglyZWFkIGRhdGEgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KKglJZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBjb250YWlucyB0aGUgY29tcGxldGUgbWVzc2FnZSwgY2hlY2sgdGhlIE1JQy4gVGhlIG1ham9yaXR5IGNvbnNpZGVyZWQgdGhpcwoqCUkvRiBtb3JlIGFwcHJvcHJpYXRlIHRoZW4gaGF2ZSB0aGUgTVNGIGNhbGwgaGNmX2dldF9kYXRhIG9ubHkgdG8gY2hlY2sgdGhlIE1JQy4KKjQ0OiBTaW5jZSB0aGUgY29tcGxldGUgbWVzc2FnZSBpcyBjb3BpZWQgZnJvbSBOSUMgUkFNIHRvIFBDIFJBTSwgdGhlIFJ4IGNhbiBiZSBhY2tub3dsZWRnZWQgdG8gdGhlIEhlcm1lcwoqCXRvIG9wdGltaXplIHRoZSBmbG93ICggYSBiZXR0ZXIgY2hhbmNlIHRvIGdldCBuZXcgUnggZGF0YSBpbiB0aGUgbmV4dCBwYXNzIHRocm91Z2ggaGNmX3NlcnZpY2VfbmljICkuCioJVGhpcyBhY2tub3dsZWRnZW1lbnQgY2FuIG5vdCBiZSBkb25lIHZpYSBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX1JYX0FDSyApIGJlY2F1c2UgdGhpcyBhbHNvIGNsZWFycwoqCUlGQl9SeExFTiB0aHVzIGNvcnJ1cHRpbmcgdGhlIEkvRiB0byB0aGUgTVNGLgoqOz86IEluIGNhc2Ugb2YgRE1BIChjb21waWxlZCBpbiBhbmQgYWN0aXZhdGVkKToKCgoqNTQ6IExpbWl0aW5nIHRoZSBudW1iZXIgb2YgcGxhY2VzIHdoZXJlIHRoZSBGL1cgaXMgYWNrZWQgKGUuZy4gdGhlIG1lcmdpbmcgb2YgdGhlIFJ4LUFDSyB3aXRoIHRoZSBvdGhlcgoqCUFDS3MpLCBpcyBzdXBwb3NlZCB0byBkaW1pbmlzaCB0aGUgcG90ZW50aWFsIG9mIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgRi9XLgoqCU5vdGUgMTogVGhlIENNRCBldmVudCBpcyBhY2tub3dsZWRnZWQgaW4gY21kX2NtcGwKKglOb3RlIDI6IEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCioJTm90ZSAzOiBUaGUgQUxMT0MgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGdldF9maWQgKGV4Y2VwdCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZsb3cpCioKKi5OT1RJQ0UKKiBUaGUgTm9uLURNQSBIUkVHX0VWX1JYIGlzIGhhbmRsZWQgZGlmZmVyZW50IGNvbXBhcmVkIHdpdGggdGhlIG90aGVyIEYvVyBldmVudHMuCiogVGhlIEhSRUdfRVZfUlggZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGJ5IHRoZSBmaXJzdCBoY2Zfc2VydmljZV9uaWMgY2FsbCBhZnRlciB0aGUKKiBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBvY2N1cnJlbmNlIG9mIHRoaXMgZXZlbnQuCiogVGhpcyBhY2tub3dsZWRnbWVudAoqIG1ha2VzIHRoZSBuZXh0IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIChpZiBhbnkpIGF2YWlsYWJsZS4KKiBBbiB1cGRhdGVkIElGQl9SeExlbgoqIGZpZWxkIHJlZmxlY3RzIHRoaXMgYXZhaWxhYmlsaXR5LgoqCiouTk9USUNFCiogVGhlIG1pbmltdW0gc2l6ZSBmb3IgTGVuIG11c3Qgc3VwcGx5IHNwYWNlIGZvcjoKKiAtCWFuIEYvVyBkZXBlbmRlbnQgbnVtYmVyIG9mIGJ5dGVzIG9mIENvbnRyb2wgSW5mbyBmaWVsZCBpbmNsdWRpbmcgdGhlIDgwMi4xMSBIZWFkZXIgZmllbGQKKiAtCURlc3RpbmF0aW9uIEFkZHJlc3MKKiAtCVNvdXJjZSBBZGRyZXNzCiogLQlMZW5ndGggZmllbGQKKiAtCVsgU05BUCBIZWFkZXJdCiogLQlbIEV0aGVybmV0LUlJIFR5cGVdCiogVGhpcyByZXN1bHRzIGluIDY4IGZvciBIZXJtZXMtSSBhbmQgODAgZm9yIEhlcm1lcy1JSQoqIFRoaXMgd2F5IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgbmVlZGVkIGJ5IHRoZSBIQ0YgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZyYW1lCiogbXVzdCBiZSBkZWNhcHN1bGF0ZWQuCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQp7CgppbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwpoY2ZfMTYJCXN0YXQ7CndjaV9idWZwCWJ1Zl9hZGRyOwpoY2ZfMTYgCQlpOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMsIGlmYnAtPklGQl9JbnRPZmZDbnQgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoKCWlmYnAtPklGQl9MaW5rU3RhdCA9IDA7IC8vIDs/IHRvIGJlIG9ic29sZXRlZCBBU0FQCQkJCQkJCQkJCQkJLyogMSovCglpZmJwLT5JRkJfRFNMaW5rU3RhdCAmPSB+Q0ZHX0xJTktfU1RBVF9DSEFOR0U7CQkJCQkJCQkJCQkJCS8qIDEqLwoJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9SWF9BQ0sgKTsJCQkJCQkJCQkJCQkJCS8qIDIqLwoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAoIHN0YXQgPSBJUFcoIEhSRUdfRVZfU1RBVCApICkgIT0gMHhGRkZGICkgewkJCQkJLyogNCovCi8qCQlJRl9OT1RfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQogKgkJSUZfTk9UX1VTRV9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH5IUkVHX0VWX0JBU0lDX01BU0ssIHN0YXQgKSApCiAqCQlJRl9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+KCBIUkVHX0VWX0JBU0lDX01BU0sgXiAoIEhSRUdfRVZfLi4uRE1BLi4uLiApLCBzdGF0ICkgKQogKi8KCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDgqLwoJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICYmIHN0YXQgJiBIUkVHX0VWX0FMTE9DICkgeyAvL05vdGU6IElGQl9Sc2NJbmQgaXMgQUxXQVlTIDEgZm9yIERNQQoJCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsKCQl9CgkJSUZfVEFMTFkoIGlmICggc3RhdCAmIEhSRUdfRVZfSU5GT19EUk9QICkgaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmSW5mbysrOyApCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCgkJaWYgKCBzdGF0ICYgSFJFR19FVl9USUNLICkgewoJCQlpZmJwLT5JRkJfVGlja0NudCsrOwoJCX0KI2lmIDAgLy8gKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCgkJaWYgKCBpZmJwLT5JRkJfVGlja0NudCA9PSAzICYmICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7CkNGR19ERFNfVElDS19USU1FX1NUUkNUIGx0djsKCQkJLy8gMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KSBpbiBub3QtY29ubmVjdGVkIG1vZGUgLS0+Z28gaW50byBEU19PT1IKCQkJaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9TTEVFUCApOwoJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCB8PSBDRkdfTElOS19TVEFUX0RTX09PUjsgLy9zZXQgT3V0T2ZSYW5nZQoJCQlsdHYubGVuID0gMjsKCQkJbHR2LnR5cCA9IENGR19ERFNfVElDS19USU1FOwoJCQlsdHYudGlja190aW1lID0gKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9USU1FUiApICsgMHgxMCApICo2NDsgLy83OCBpcyBtb3JlIHJpZ2h0CgkJCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmx0diApOwoJCQlwcmludGsoICI8NT5QcmVwYXJpbmcgZm9yIHNsZWVwLCBsaW5rX3N0YXR1czogJTA0WCwgdGltZXIgOiAlZFxuIiwKCQkJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCwgbHR2LnRpY2tfdGltZSApOy8vOz9yZW1vdmUgbWUgMSBkYXkKCQkJaWZicC0+SUZCX1RpY2tDbnQrKzsgLy87P2p1c3QgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBrZWVwIG9uIHByaW50aW5nIGFib3ZlIG1lc3NhZ2UKCQkJaWYgKCBsdHYudGlja190aW1lIDwgMzAwICogMTI1ICkgaWZicC0+SUZCX0RTTGlua1N0YXQgKz0gMHgwMDEwOwoKCQl9CiNlbmRpZiAvLyBIQ0ZfRERTCiNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCgkJaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPICkgewoJCQlpc3JfaW5mbyggaWZicCApOwoJCX0KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RYX0VYCgkJaWYgKCBzdGF0ICYgSFJFR19FVl9UWF9FWFQgJiYgKCBpID0gSVBXKCBIUkVHX1RYX0NPTVBMX0ZJRCApICkgIT0gMCAvKkRBV0EqLyApIHsKCQkJREFXQV9aRVJPX0ZJRCggSFJFR19UWF9DT01QTF9GSUQgKQoJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGksIDAsIElPX0lOICk7CgkJCWdldF9mcmFnKCBpZmJwLCAmaWZicC0+SUZCX1R4RnNTdGF0LCBIRlNfU1dTVVAgQkVfUEFSKDEpICk7CgkJfQojZW5kaWYgLy8gSENGX0VYVF9JTlRfVFhfRVgKLy8hcmxhdiBETUEgZW5naW5lIHdpbGwgaGFuZGxlIHRoZSByeCBldmVudCwgbm90IHRoZSBkcml2ZXIKI2lmIEhDRl9ETUEKCQlpZiAoICEoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkgLy8hISBiZSBhd2FyZSBvZiB0aGUgbG9naWNhbCBpbmRlbnRhdGlvbnMKI2VuZGlmIC8vIEhDRl9ETUEKLyoxNiovCSAgaWYgKCBzdGF0ICYgSFJFR19FVl9SWCAmJiAoIGlmYnAtPklGQl9SeEZJRCA9IElQVyggSFJFR19SWF9GSUQgKSApICE9IDAgKSB7IC8vaWYgMCB0aGVuIERBV0FfQUNLCgkJCUhDRkFTU0VSVCggYnVmcCwgbGVuICkKCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIsIGxlbiApCgkJCURBV0FfWkVST19GSUQoIEhSRUdfUlhfRklEICkKCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhGSUQgPCBDRkdfUFJPRF9EQVRBLCBpZmJwLT5JRkJfUnhGSUQpCgkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgaWZicC0+SUZCX1J4RklELCAwLCBJT19JTiApOwoJCQlnZXRfZnJhZyggaWZicCwgYnVmcCwgSEZTX0FERFJfREVTVCBCRV9QQVIoMSkgKTsKCQkJaWZicC0+SUZCX2xhcCA9IGJ1Zl9hZGRyID0gYnVmcCArIEhGU19BRERSX0RFU1Q7CgkJCWlmYnAtPklGQl9SeExlbiA9IChoY2ZfMTYpKGJ1ZnBbSEZTX0RBVF9MRU5dICsgKGJ1ZnBbSEZTX0RBVF9MRU4rMV08PDgpICsgMio2ICsgMik7Ci8qMjYqLwkJaWYgKCBpZmJwLT5JRkJfUnhMZW4gPj0gMjIgKSB7CQkvLyBjb252ZW5pZW50IGZvciBNSUMgY2FsY3VsYXRpb24gKDUgRFdzICsgMSAic2tpcHBlZCIgVykKCQkJCQkJCQkJCQkJLy8uICBnZXQgREEsU0EsTGVuL1R5cGUgYW5kIChTTkFQLFR5cGUgb3IgOCBkYXRhIGJ5dGVzKQovKjMwKi8JCQlnZXRfZnJhZyggaWZicCwgYnVmX2FkZHIsIDIyIEJFX1BBUigwKSApOwovKjMyKi8JCQlDQUxDX1JYX01JQyggYnVmcCwgLTEgKTsJCS8vLiAgaW5pdGlhbGl6ZSBNSUMKCQkJCUNBTENfUlhfTUlDKCBidWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkvLy4gIE1JQyBvdmVyIERBLCBTQQoJCQkJQ0FMQ19SWF9NSUMoIG51bGxfYWRkciwgNCApOwkvLy4gIE1JQyBvdmVyICh2aXJ0dWFsKSBwcmlvcml0eSBmaWVsZAoJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyKzE0LCA4ICk7CS8vLiAgc2tpcCBMZW4sIE1JQyBvdmVyIFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCgkJCQlidWZfYWRkciArPSAyMjsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKLy8hIWJlIGNhcmVmdWwgZG8gbm90IHVzZSBwb3NpdGl2ZSB0ZXN0IG9uIEhDRl9BQ1RfQ0NYX09GRiwgYmVjYXVzZSBJRkJfQ0tJUFN0YXQgaXMgaW5pdGlhbGx5IDAKCQkJCWlmKCBpZmJwLT5JRkJfQ0tJUFN0YXQgIT0gSENGX0FDVF9DQ1hfT04gICkKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCQkJewojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwoJCQkJCUhDRkFTU0VSVCggbGVuID49IEhGU19EQVQgKyAyICsgc2l6ZW9mKHNuYXBfaGVhZGVyKSwgbGVuICkKLyozNCovIAkJCQlpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJCQkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCQkJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJmJ1ZnBbSEZTX1RZUEVdICkgIT0gRU5DX1RVTk5FTCApICkgewoJCQkJCQkJCQkJCQkvLy4gIGNvcHkgRS1JSSBUeXBlIHRvIDgwMi4zIExFTiBmaWVsZAovKjM2Ki8JCQkJCWJ1ZnBbSEZTX0xFTiAgXSA9IGJ1ZnBbSEZTX1RZUEUgIF07CgkJCQkJCWJ1ZnBbSEZTX0xFTisxXSA9IGJ1ZnBbSEZTX1RZUEUrMV07CgkJCQkJCQkJCQkJCS8vLiAgZGlzY2FyZCBTbmFwIGJ5IG92ZXJ3cml0aW5nIHdpdGggZGF0YQoJCQkJCQlpZmJwLT5JRkJfUnhMZW4gLT0gKEhGU19UWVBFIC0gSEZTX0xFTik7CgkJCQkJCWJ1Zl9hZGRyIC09ICggSEZTX1RZUEUgLSBIRlNfTEVOICk7IC8vIHRoaXMgaGFwcGVucyB0byBicmluZyB1cyBhdCBhIERXIGJvdW5kYXJ5IG9mIDM2CgkJCQkJfQojZW5kaWYgLy8gSENGX0VOQwoJCQkJfQoJCQl9Ci8qNDAqLwkJaWZicC0+SUZCX2xhbCA9IG1pbiggKGhjZl8xNikobGVuIC0gSEZTX0FERFJfREVTVCksIGlmYnAtPklGQl9SeExlbiApOwoJCQlpID0gaWZicC0+SUZCX2xhbCAtICggYnVmX2FkZHIgLSAoIGJ1ZnAgKyBIRlNfQUREUl9ERVNUICkgKTsKCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCBpIEJFX1BBUigwKSApOwoJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIGkgKTsKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCQkJaWYgKCBpZmJwLT5JRkJfbGFsID09IGlmYnAtPklGQl9SeExlbiApIHsKCQkJCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CgkJCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQovKjQ0Ki8JCWlmICggbGVuIC0gSEZTX0FERFJfREVTVCA+PSBpZmJwLT5JRkJfUnhMZW4gKSB7CgkJCQlpZmJwLT5JRkJfUnhGSUQgPSAwOwoJCQl9IGVsc2UgeyAvKiBJRkJfUnhGSUQgaXMgY2xlYXJlZCwgc28gIHlvdSBkbyBub3QgZ2V0IGFub3RoZXIgUnhfQWNrIGF0IG5leHQgZW50cnkgb2YgaGNmX3NlcnZpY2VfbmljICovCgkJCQlzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7CS8vZG9uJ3QgYWNrIFJ4IGlmIHByb2Nlc3Npbmcgbm90IHlldCBjb21wbGV0ZWQKCQkJfQoJCX0KCQkvLyBpbiBjYXNlIG9mIERNQTogc2lnbmFsIGF2YWlsYWJpbGl0eSBvZiByeCBhbmQvb3IgdHggcGFja2V0cyB0byBNU0YKCQlJRl9VU0VfRE1BKCBpZmJwLT5JRkJfRG1hUGFja2V0cyB8PSBzdGF0ICYgKCBIUkVHX0VWX1JETUFEIHwgSFJFR19FVl9URE1BRCApOyApCgkJLy8gcmxhdiA6IHBlbmRpbmcgSFJFR19FVl9SRE1BRCBvciBIUkVHX0VWX1RETUFEIGV2ZW50cyBnZXQgYWNrbm93bGVkZ2VkIGhlcmUuCi8qNTQqLwlzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOwovL2EgcG9zaXRpdmUgbWFzayB3b3VsZCBiZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCAvKjU0Ki8Jc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKCQlJRl9VU0VfRE1BKCBzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7ICkKCQlpZiAoIHN0YXQgKSB7CgkJCURBV0FfQUNLKCBzdGF0ICk7CS8qREFXQSovCgkJfQoJfQoJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFUlZJQ0VfTklDICkKCXJldHVybiByYzsKfSAvLyBoY2Zfc2VydmljZV9uaWMKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKiBIIEMgRiAgIFMgVSBQIFAgTyBSIFQgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQoqLlBVUlBPU0UJCWNhbGN1bGF0ZSBNSUMgb24gYSBxdWFkIGJ5dGUuCioKKi5BUkdVTUVOVFMKKglwCQkJYWRkcmVzcyBvZiB0aGUgTUlDCioJbQkJCTMyIGJpdCB2YWx1ZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIE1JQyBjYWxjdWxhdGlvbiBlbmdpbmUKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogY2FsY19taWMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSUMgYWxnb3JpdGhtLiBJdCBpcyBhIG1vbmtleS1zZWUgbW9ua2V5LWRvIGNvcHkgb2YKKiBNaWNoYWVsOjphcHBlbmRCeXRlKCkKKiBvZiBBcHBlbmRpeCBDIG9mIC4uLi4uLi4uLi4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKCiNkZWZpbmUgUk9MMzIoIEEsIG4gKSAoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQojZGVmaW5lIFJPUjMyKCBBLCBuICkgUk9MMzIoIChBKSwgMzItKG4pICkKCiNkZWZpbmUgTAkqcAojZGVmaW5lIFIJKihwKzEpCgp2b2lkCmNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBtICkKewojaWYgSENGX0JJR19FTkRJQU4KCW0gPSAobSA+PiAxNikgfCAobSA8PCAxNik7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgoJTCBePSBtOwoJUiBePSBST0wzMiggTCwgMTcgKTsKCUwgKz0gUjsKCVIgXj0gKChMICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKEwgJiAweDAwZmYwMGZmKSA8PCA4KTsKCUwgKz0gUjsKCVIgXj0gUk9MMzIoIEwsIDMgKTsKCUwgKz0gUjsKCVIgXj0gUk9SMzIoIEwsIDIgKTsKCUwgKz0gUjsKfSAvLyBjYWxjX21pYwojdW5kZWYgUgojdW5kZWYgTAojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgoKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQoqLlBVUlBPU0UJCWNhbGN1bGF0ZSBNSUMgb24gYSBzaW5nbGUgZnJhZ21lbnQuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIGNhbGNfbWljX3J4X2ZyYWcgLi4uLi4uLi4KKgoqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgoqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCiogaGNmX3Jjdl9tc2cuCioKKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQp7CnN0YXRpYyB1bmlvbiB7IGhjZl8zMiB4MzI7IGhjZl8xNiB4MTZbMl07IGhjZl84IHg4WzRdOyB9IHg7CS8vKiBhcmVhIHRvIGFjY3VtdWxhdGUgNCBieXRlcyBpbnB1dCBmb3IgTUlDIGVuZ2luZQppbnQgaTsKCglpZiAoIGxlbiA9PSAtMSApIHsJCQkJCQkJCS8vaW5pdGlhbGl6ZSBNSUMgaG91c2VrZWVwaW5nCgkJaSA9ICood2NpX3JlY29yZHApJnBbSEZTX1NUQVRdOwoJCS8qIGkgPSBDTlZfU0hPUlRQX1RPX0xJVFRMRSgmcFtIRlNfU1RBVF0pOyBzaG91bGQgbm90IGJlIG5lZWRlIHRvIHByZXZlbnQgYWxpZ25tZW50IHBvcm9ibGVtcwoJCSAqIHNpbmNlIGxlbiA9PSAtMSBpZiBhbmQgb25seSBpZiBwIGlzIGxvb2thaGFlYWQgYnVmZmVyIHdoaWNoIE1VU1QgYmUgd29yZCBhbGlnbmVkCgkJICogdG8gYmUgcmUtaW52ZXN0aWdhdGVkIGJ5IE52UgoJCSAqLwoKCQlpZiAoICggaSAmIEhGU19TVEFUX01JQyApID09IDAgKSB7CgkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gMHhGRkZGOwkJCS8vc3VwcHJlc3MgTUlDIGNhbGN1bGF0aW9uCgkJfSBlbHNlIHsKCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAwOwovLyoJTm90ZSB0aGF0ICJjb2luY2lkZW50YWxseSIgdGhlIGJpdCBwb3NpdGlvbnMgdXNlZCBpbiBIRlNfU1RBVAovLyoJY29ycmVzcG9uZCB3aXRoIHRoZSBvZmZzZXQgb2YgdGhlIGtleSBpbiBJRkJfTUlDS2V5CgkJCWkgPSAoIGkgJiBIRlNfU1RBVF9NSUNfS0VZX0lEICkgPj4gMTA7CS8qIGNvaW5jaWRlbnRhbGx5IG5vIHNoaWZ0IG5lZWRlZCBmb3IgaSBpdHNlbGYgKi8KCQkJaWZicC0+SUZCX01JQ1J4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpICBdKTsKCQkJaWZicC0+SUZCX01JQ1J4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpKzFdKTsKCQl9Cgl9IGVsc2UgewoJCWlmICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPT0gMCApIHsKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQlwICs9IDQ7CgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0gZWxzZSB7CgkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDQ7CgkJCQlsZW4gLT0gNDsKCQkJfQoJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5IDwgNCAmJiBsZW4gKSB7CQkvL25vdGUgZm9yIGhjZl8xNiBhcHBsaWVzOiAweEZGRkYgPiA0CgkJCXgueDhbaWZicC0+SUZCX01JQ1J4Q2FycnkrK10gPSAqcCsrOwoJCQlsZW4tLTsKCQl9CgkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA9PSA0ICkgewkvL2NvbnRyaXZlZCBzbyB3ZSBoYXZlIG9ubHkgMSBjYWxsIHRvIGNhbGNfbWljIHNvIHdlIGNvdWxkIGJyaW5nIGl0IGluLWxpbmUKCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNSeCwgeC54MzIgKTsKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQlwICs9IDQ7CgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0KCQkJbGVuIC09IDQ7CgkJfQoJfQp9IC8vIGNhbGNfbWljX3J4X2ZyYWcKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBjYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQoqLlBVUlBPU0UJCWNhbGN1bGF0ZSBNSUMgb24gYSBzaW5nbGUgZnJhZ21lbnQuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIGNhbGNfbWljX3R4X2ZyYWcgLi4uLi4uLi4KKgoqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgoqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCiogaGNmX3Jjdl9tc2cuCioKKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApjYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQp7CnN0YXRpYyB1bmlvbiB7IGhjZl8zMiB4MzI7IGhjZl8xNiB4MTZbMl07IGhjZl84IHg4WzRdOyB9IHg7CS8vKiBhcmVhIHRvIGFjY3VtdWxhdGUgNCBieXRlcyBpbnB1dCBmb3IgTUlDIGVuZ2luZQoKCQkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWxpemF0aW9uIHJlcXVlc3QKCWlmICggbGVuID09IC0xICkgewoJCQkJCQkJCQkJCQkJCS8vLiAgcHJlc3VtZSBNSUMgY2FsY3VsYXRpb24gZGlzYWJsZWQKCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDB4RkZGRjsKCQkJCQkJCQkJCQkJCQkvLy4gIGlmIE1JQyBjYWxjdWxhdGlvbiBlbmFibGVkCgkJaWYgKCBpZmJwLT5JRkJfTUlDVHhDbnRsICkgewoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY2xlYXIgTUlDIGNhcnJ5CgkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gMDsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGluaXRpYWxpemUgTUlDLWVuZ2luZQoJCQlpZmJwLT5JRkJfTUlDVHhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzBdKTsJLypUeCBhbHdheXMgdXNlcyBLZXkgMCAqLwoJCQlpZmJwLT5JRkJfTUlDVHhbMV0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzFdKTsKCQl9CgkJCQkJCQkJCQkJCQkJLy9lbHNlCgl9IGVsc2UgewoJCQkJCQkJCQkJCQkJCS8vLiAgaWYgTUlDIGVuYWJsZWQgKFR4KSAvIGlmIE1JQyBwcmVzZW50IChSeCkKCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBubyBjYXJyeSBmcm9tIHByZXZpb3VzIGNhbGNfbWljX2ZyYWcKCQlpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ID09IDAgKSB7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBwcmVzZXQgYWNjdSB3aXRoIDQgYnl0ZXMgZnJvbSBidWZmZXIKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJcCArPSA0OwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcwoJCQlpZiAoIGxlbiA8IDQgKSB7CgkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCQkJCQkJCQkJCQkJLy8uICAuICBlbHNlCgkJCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBjb21wbGV0ZSBkb3VibGUgd29yZAoJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSA0OwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCgkJCQlsZW4gLT0gNDsKCQkJfQoJCQkJCQkJCQkJCQkJCS8vLiAgZWxzZSBpZiBNSUMgZW5hYmxlZAoJCQkJCQkJCQkJCQkJCS8vLiAgYW5kIGlmIGNhcnJ5IGJ5dGVzIGZyb20gcHJldmlvdXMgY2FsY19taWNfdHhfZnJhZwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgbW92ZSAoMS0zKSBieXRlcyBmcm9tIGNhcnJ5IGludG8gYWNjdQoJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5IDwgNCAmJiBsZW4gKSB7CQkvKiBub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNCAqLwoJCQl4Lng4W2lmYnAtPklGQl9NSUNUeENhcnJ5KytdID0gKnArKzsKCQkJbGVuLS07CgkJfQoJCQkJCQkJCQkJCQkJCS8vLiAgd2hpbGUgYWNjdSBjb250YWlucyBjb21wbGV0ZSBkb3VibGUgd29yZAoJCQkJCQkJCQkJCQkJCS8vLiAgYW5kIE1JQyBlbmFibGVkCgkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSA0ICkgewoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgcGFzcyBhY2N1IHRvIE1JQyBlbmdpbmUKCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNUeCwgeC54MzIgKTsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgbmV4dCA0IGJ5dGVzIGZyb20gYnVmZmVyIHRvIGFjY3UKCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBwb2ludGVyCgkJCXAgKz0gNDsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBjb250YWluZWQgbGVzcyB0aGVuIDQgYnl0ZXMKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAoJCQlpZiAoIGxlbiA8IDQgKSB7CgkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IChoY2ZfMTYpbGVuOwoJCQl9CgkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKCQkJbGVuIC09IDQ7CgkJfQoJfQp9IC8vIGNhbGNfbWljX3R4X2ZyYWcKI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCiNpZiBIQ0ZfUFJPVF9USU1FCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBjYWxpYnJhdGUoIElGQlAgaWZicCApCiouUFVSUE9TRQkJY2FsaWJyYXRlcyB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIgdGljay4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBjYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrCiogSUZCX1RpY2tJbmkgaXMgdGhlIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBzdWNoIHRoYXQgdGhlIGV4cGlyYXRpb24gcGVyaW9kCiogbW9yZSBvciBsZXNzIGluZGVwZW5kZW50IG9mIHRoZSBwcm9jZXNzb3Igc3BlZWQuIElmIElGQl9UaWNrSW5pIGlzIG5vdCB5ZXQgY2FsaWJyYXRlZCwgaXQgaXMgZG9uZSBub3cuCiogVGhpcyBjYWxpYnJhdGlvbiBpcyAicmVhc29uYWJseSIgYWNjdXJhdGUgYmVjYXVzZSB0aGUgSGVybWVzIGlzIGluIGEgcXVpZXQgc3RhdGUgYXMgYSByZXN1bHQgb2YgdGhlCiogSW5pdGlhbGl6ZSBjb21tYW5kLgoqCioKKi5ESUFHUkFNCioKKjE6CUlGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IElOSV9USUNLX0lOSSBieSBoY2ZfY29ubmVjdC4gSWYgY2FsaWJyYXRlIHN1Y2NlZWRzLCBJRkJfVGlja0luaSBpcwoqCWd1YXJhbnRlZWQgdG8gYmUgY2hhbmdlZC4gQXMgYSBjb25zZXF1ZW5jZSB0aGVyZSB3aWxsIGJlIG9ubHkgMSBzaG90IGF0IGNhbGlicmF0aW9uIChyZWdhcmRsZXNzIG9mIHRoZQoqCW51bWJlciBvZiBpbml0IGNhbGxzKSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4KKjI6CUNhbGlicmF0aW9uIGlzIGRvbmUgSENGX1BST1RfVElNRV9DTlQgdGltZXMuIFRoaXMgZGltaW5pc2ggdGhlIGVmZmVjdHMgb2Ygaml0dGVyIGFuZCBpbnRlcmZlcmVuY2UsCioJZXNwZWNpYWxseSBpbiBhIHByZS1lbXB0aXZlIGVudmlyb25tZW50LiBIQ0ZfUFJPVF9USU1FX0NOVCBpcyBpbiB0aGUgcmFuZ2Ugb2YgMTYgdGhyb3VnaCAzMiBhbmQgZGVyaXZlZAoqCWZyb20gdGhlIEhDRl9QUk9UX1RJTUUgc3BlY2lmaWVkIGJ5IHRoZSBNU0YgcHJvZ3JhbW1lci4gVGhlIGRpdmlzb3IgbmVlZGVkIHRvIHNjYWxlIEhDRl9QUk9UX1RJTUUgaW50byB0aGUKKgkxNi0zMiByYW5nZSwgaXMgdXNlZCBhcyBhIG11bHRpcGxpY2F0b3IgYWZ0ZXIgdGhlIGNhbGlicmF0aW9uLCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUKKglyZXF1ZXN0ZWQgcmFuZ2UuIFRoaXMgd2F5IGEgY29tcHJvbWlzZSBpcyBhY2hpZXZlZCBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBkdXJhdGlvbiBvZiB0aGUgY2FsaWJyYXRpb24KKglwcm9jZXNzLgoqMzoJQWNrbm93bGVkZ2UgdGhlIFRpbWVyIFRpY2sgRXZlbnQuCioJRWFjaCBjeWNsZSBpcyBsaW1pdGVkIHRvIGF0IG1vc3QgSU5JX1RJQ0tfSU5JIHNhbXBsZXMgb2YgdGhlIFRpbWVyVGljayBzdGF0dXMgb2YgdGhlIEhlcm1lcy4KKglTaW5jZSB0aGUgc3RhcnQgb2YgY2FsaWJyYXRlIGlzIHVucmVsYXRlZCB0byB0aGUgSGVybWVzIEludGVybmFsIFRpbWVyLCB0aGUgZmlyc3QgaW50ZXJ2YWwgbWF5IGxhc3QgZnJvbSAwCioJdG8gdGhlIG5vcm1hbCBpbnRlcnZhbCwgYWxsIHN1YnNlcXVlbnQgaW50ZXJ2YWxzIHNob3VsZCBiZSB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIEhlcm1lcyBUaWNrIGludGVydmFsLgoqCVRoZSBIZXJtZXMgVGltZXIgVGljayBpcyBub3QgcmVwcm9ncmFtbWVkIGJ5IHRoZSBIQ0YsIGhlbmNlIGl0IGlzIHJ1bm5pbmcgYXQgdGhlIGRlZmF1bHQgb2YgMTAgawoqCW1pY3Jvc2Vjb25kcy4KKjQ6CUlmIHRoZSBUaW1lciBUaWNrIEV2ZW50IGlzIGNvbnRpbnVvdXNseSB1cCAocHJvdF9jbnQgc3RpbGwgaGFzIHRoZSB2YWx1ZSBJTklfVElDS19JTkkpIG9yIG5vIFRpbWVyIFRpY2sKKglFdmVudCBvY2N1cnJlZCBiZWZvcmUgdGhlIHByb3RlY3Rpb24gY291bnRlciBleHBpcmVkLCByZXNldCBJRkJfVGlja0luaSB0byBJTklfVElDS19JTkksCioJc2V0IHRoZSBkZWZ1bmN0IGJpdCBvZiBJRkJfQ2FyZFN0YXQgKHRodXMgcmVuZGVyaW5nIHRoZSBIZXJtZXMgaW5vcGVyYWJsZSkgYW5kIGV4aXQgdGhlIGNhbGlicmF0ZSByb3V0aW5lLgoqODoJaWZicC0+SUZCX1RpY2tJbmkgaXMgbXVsdGlwbGllZCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUgcmVxdWVzdGVkIHJhbmdlIGFzIGV4cGxhaW5lZCB1bmRlciAyLgoqCiouTk9USUNFCiogbyBBbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygdmlld3BvaW50cyBwb3NzaWJsZSwgY2FsaWJyYXRlKCkgdXNlcyBhcyBlcnJvciBzdHJhdGVneSB0aGF0IGEgc2luZ2xlCioJZmFpbHVyZSBvZiB0aGUgSGVybWVzIFRpbWVyVGljayBpcyBjb25zaWRlcmVkIGZhdGFsLgoqIG8gVGhlcmUgaXMgbm8gaGFyZCBhbmQgY29uY3JldGUgdGltZS1vdXQgdmFsdWUgZGVmaW5lZCBmb3IgSGVybWVzIGFjdGl2aXRpZXMuIFRoZSBkZWZhdWx0IDEgc2Vjb25kcyBpcwoqCWJlbGlldmVkIHRvIGJlIHN1ZmZpY2llbnRseSAicmVsYXhlZCIgZm9yIHJlYWwgbGlmZSBhbmQgdG8gYmUgc3VmZmljaWVudGx5IHNob3J0IHRvIGJlIHN0aWxsIHVzZWZ1bCBpbiBhbgoqCWVudmlyb25tZW50IHdpdGggaHVtYW5zLgoqIG8gTm90ZSB0aGF0IHZpYSBJRkJfRGVmdW5jdFN0YXQgdGltZSBvdXRzIGluIGNtZF93YWl0IGFuZCBpbiBoY2Zpb19zdHJpbmcgYmxvY2sgYWxsIEhlcm1lcyBhY2Nlc3MgdGlsbCB0aGUKKgluZXh0IGluaXQgc28gZnVuY3Rpb25zIHdoaWNoIGNhbGwgYSBtaXggb2YgY21kX3dhaXQgYW5kIGhjZmlvX3N0cmluZyBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiBzdGF0dXMKKglvZiB0aGUgbGFzdCBjYWxsCiogbyBUaGUgcmV0dXJuIGNvZGUgaXMgcHJlc2V0IGF0IFRpbWUgb3V0LgoqCVRoZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiB0aGF0IG5vIGNhbGlicmF0ZWQgdmFsdWUgZm9yIHRoZSBwcm90ZWN0aW9uIGNvdW50IGNhbiBiZSBhc3N1bWVkIHNpbmNlCioJY2FsaWJyYXRlKCkgZG9lcyBub3QgeWV0IGhhdmUgZGV0ZXJtaW5lZCBhIGNhbGlicmF0ZWQgdmFsdWUgKGEgY2F0Y2ggMjIpLCBpcyBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlCioJaW5pdGlhbCB2YWx1ZSBhdCBJTklfVElDS19JTkkgKGJ5IGhjZl9jb25uZWN0KS4gVGhpcyBhcHByb2FjaCBpcyBjb25zaWRlcmVkIHNhZmUsIGJlY2F1c2U6CioJICAtIHRoZSBIQ0YgZG9lcyBub3QgdXNlIHRoZSBwaXBlbGluZSBtZWNoYW5pc20gb2YgSGVybWVzIGNvbW1hbmRzLgoqCSAgLSB0aGUgbGlrZWxpaG9vZCBvZiBmYWlsdXJlICh0aGUgb25seSB0aW1lIHdoZW4gcHJvdGVjdGlvbiBjb3VudCBpcyByZWxldmFudCkgaXMgc21hbGwuCioJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IGxhcmdlIG9uIGEgZmFzdCBtYWNoaW5lIChidXN5IGJpdCBkcm9wcyBvbiBnb29kIE5JQyBiZWZvcmUgY291bnRlcgoqCQlleHBpcmVzKQoqCSAgLSB0aGUgdGltZSB3aWxsIGJlIHN1ZmZpY2llbnRseSBzbWFsbCBvbiBhIHNsb3cgbWFjaGluZSAoY291bnRlciBleHBpcmVzIG9uIGJhZCBOSUMgYmVmb3JlIHRoZSBlbmQgdXNlcgoqCSAgCXN3aXRjaGVzIHRoZSBwb3dlciBvZmYgaW4gZGVzcGFpcgoqCVRoZSB0aW1lIG5lZWRlZCB0byB3cmFwIGEgMzIgYml0IGNvdW50ZXIgYXJvdW5kIGlzIGxvbmdlciB0aGFuIG1hbnkgaHVtYW5zIHdhbnQgdG8gd2FpdCwgaGVuY2UgdGhlIG1vcmUgb3IKKglsZXNzIGFyYml0cmFyeSB2YWx1ZSBvZiAweDQwMDAwTCBpcyBjaG9zZW4sIGFzc3VtaW5nIGl0IGRvZXMgbm90IHRha2UgdG9vIGxvbmcgb24gYW4gWFQgYW5kIGlzIG5vdCB0b28KKglzaG9ydCBvbiBhIHNjcmVhbS1tYWNoaW5lLgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQp7CmludAkJY250ID0gSENGX1BST1RfVElNRV9DTlQ7CmhjZl8zMglwcm90X2NudDsKCglIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0NBTElCUkFURSApOwoJaWYgKCBpZmJwLT5JRkJfVGlja0luaSA9PSBJTklfVElDS19JTkkgKSB7CQkJCQkJCQkJCQkJCS8qMSovCgkJaWZicC0+SUZCX1RpY2tJbmkgPSAwOwkJCQkJCQkJCQkJCQkJCQkJLyoyKi8KCQkJd2hpbGUgKCBjbnQtLSApIHsKCQkJCXByb3RfY250ID0gSU5JX1RJQ0tfSU5JOwoJCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9USUNLICk7CQkJCQkJCQkJCQkJLyozKi8KCQkJCXdoaWxlICggKElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX1RJQ0spID09IDAgJiYgLS1wcm90X2NudCApIHsKCQkJCQlpZmJwLT5JRkJfVGlja0luaSsrOwoJCQkJfQoJCQkJaWYgKCBwcm90X2NudCA9PSAwIHx8IHByb3RfY250ID09IElOSV9USUNLX0lOSSApIHsJCQkJCQkJCS8qNCovCgkJCQkJaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7CgkJCQkJaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVSOwoJCQkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgcHJvdF9jbnQgKQoJCQkJfQoJCQl9CgkJaWZicC0+SUZCX1RpY2tJbmkgPDw9IEhDRl9QUk9UX1RJTUVfU0hGVDsJCQkJCQkJCQkJCQkvKjgqLwoJfQoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9DQUxJQlJBVEUgfCBIQ0ZfVFJBQ0VfRVhJVCApOwp9IC8vIGNhbGlicmF0ZQojZW5kaWYgLy8gSENGX1BST1RfVElNRQoKCiNpZiAoSENGX0RMX09OTFkpID09IDAKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgY2hlY2tfbWljKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCXZlcmlmaWVzIHRoZSBNSUMgb2YgYSByZWNlaXZlZCBub24tVVNCIGZyYW1lLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX01JQwoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqCio0Ogl0ZXN0IHdoZXRoZXIgb3Igbm90IGEgTUlDIGlzIHJlcG9ydGVkIGJ5IHRoZSBIZXJtZXMKKjE0OiB0aGUgY2FsY3VsYXRlZCBNSUMgYW5kIHRoZSByZWNlaXZlZCBNSUMgYXJlIGNvbXBhcmVkLCB0aGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoCioKKi5OT1RJQ0UKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApjaGVja19taWMoIElGQlAgaWZicCApCnsKaW50CQlyYyA9IEhDRl9TVUNDRVNTOwpoY2ZfMzIgeDMyWzJdOwkJCQkvLyogYXJlYSB0byBzYXZlIHJjdmQgOCBieXRlcyBNSUMKCgkJCQkJCQkJCQkJCQkvL2lmIE1JQyBwcmVzZW50IGluIFJ4RlMKCWlmICggKih3Y2lfcmVjb3JkcCkmaWZicC0+SUZCX2xhcFstSEZTX0FERFJfREVTVF0gJiBIRlNfU1RBVF9NSUMgKSB7CgkvL29yIGlmICggaWZicC0+SUZCX01JQ1J4Q2FycnkgIT0gMHhGRkZGICkKCQlDQUxDX1JYX01JQyggbWljX3BhZCwgOCApOwkJCQkJLy8uICBwcm9jZXNzIHVwIHRvIDMgcmVtYWluaW5nIGJ5dGVzIG9mIGRhdGEgYW5kIGFwcGVuZCA1IHRvIDggYnl0ZXMgb2YgcGFkZGluZyB0byBNSUMgY2FsY3VsYXRpb24KCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKXgzMiwgOCBCRV9QQVIoMCkpOy8vLiAgZ2V0IDggYnl0ZSBNSUMgZnJvbSBOSUMKCQkJCQkJCQkJCQkJCS8vLiAgaWYgY2FsY3VsYXRlZCBhbmQgcmVjZWl2ZWQgTUlDIGRvIG5vdCBtYXRjaAoJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgc3RhdHVzIGF0IEhDRl9FUlJfTUlDCi8qMTQqLyAgaWYgKCB4MzJbMF0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFswXSkgfHwKICAgICAgICAJIHgzMlsxXSAhPSBDTlZfTElUVExFX1RPX0xPTkcoaWZicC0+SUZCX01JQ1J4WzFdKQkgICkgewoJCQlyYyA9IEhDRl9FUlJfTUlDOwoJCX0KCX0KCQkJCQkJCQkJCQkJCS8vcmV0dXJuIHN0YXR1cwoJcmV0dXJuIHJjOwp9IC8vIGNoZWNrX21pYwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IGNtZF9jbXBsKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCXdhaXRzIGZvciBIZXJtZXMgQ29tbWFuZCBDb21wbGV0aW9uLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJSUZCX0RlZnVuY3RTdGF0CioJSENGX0VSUl9USU1FX09VVAoqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCioJSENGX1NVQ0NFU1MKKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKgoqMjoJT25jZSBjbWRfY21wbCBpcyBjYWxsZWQsIHRoZSBCdXN5IG9wdGlvbiBiaXQgaW4gSUZCX0NtZCBtdXN0IGJlIGNsZWFyZWQKKjQ6CUlmIFN0YXR1cyByZWdpc3RlciBhbmQgY29tbWFuZCBjb2RlIGRvbid0IG1hdGNoIGVpdGhlcjoKKgkgLSB0aGUgSGVybWVzIGFuZCBIb3N0IGFyZSBvdXQgb2Ygc3luYyAoIGEgZmF0YWwgZXJyb3IpCioJIC0gZXJyb3IgYml0cyBhcmUgcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCioJT3V0IG9mIHN5bmMgaXMgY29uc2lkZXJlZCBmYXRhbCBhbmQgYnJpbmdzIHRoZSBIQ0YgaW4gRGVmdW5jdCBtb2RlCioJRXJyb3JzIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIHNob3VsZCBiZSBjYXVzZWQgYnkgc2VxdWVuY2UgdmlvbGF0aW9ucyBpbiBIZXJtZXMgY29tbWFuZAoqCXNlcXVlbmNlcyBhbmQgaGVuY2UgdGhlc2UgYnVncyBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kIGR1cmluZyBlbmdpbmVlcmluZyB0ZXN0aW5nLiBTaW5jZSB0aGVyZSBpcyBubwoqCXN0cmF0ZWd5IHRvIGNvcGUgd2l0aCB0aGlzIHByb2JsZW0sIGl0IG1pZ2h0IGFzIHdlbGwgYmUgaWdub3JlZCBhdCBydW4gdGltZS4gTm90ZSB0aGF0IGZvciBhbnkgcGFydGljdWxhcgoqCXNpdHVhdGlvbiB3aGVyZSBhIHN0cmF0ZWd5IGlzIGZvcm11bGF0ZWQgdG8gaGFuZGxlIHRoZSBjb25zZXF1ZW5jZXMgb2YgYSBwYXJ0aWN1bGFyIGJ1ZyBjYXVzaW5nIGEKKglwYXJ0aWN1bGFyIEVycm9yIHNpdHVhdGlvbiByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciwgdGhlIGJ1ZyBzaG91bGQgYmUgcmVtb3ZlZCByYXRoZXIgdGhhbiBhZGRpbmcKKglsb2dpYyB0byBjb3BlIHdpdGggdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgYnVnLgoqCVRoZXJlIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2hlcmUgYW4gZXJyb3IgcmVwb3J0IHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIGV2ZW4gYnJvdWdodCB0aGUgSENGIGluIGRlZnVuY3QKKgltb2RlIChhbHRob3VnaCBpdCB3YXMgbm90IHlldCBuYW1lZCBsaWtlIHRoYXQgYXQgdGhhdCB0aW1lKS4gVGhpcyBpcyBwYXJ0aWN1bGFyIHVuZGVzaXJhYmxlIGJlaGF2aW9yIGZvciBhCioJZ2VuZXJhbCBsaWJyYXJ5LgoqCVNpbXBseSByZXBvcnRpbmcgdGhlIGVycm9yIChhcyAiaW50ZXJlc3RpbmciKSBpcyBkZWJhdGFibGUuIFRoZXJlIGFsc28gaGF2ZSBiZWVuIEhDRiB2ZXJzaW9ucyB3aXRoIHRoaXMKKglzdHJhdGVneSB1c2luZyB0aGUgInZhZ3VlIiBIQ0ZfRkFJTFVSRSBjb2RlLgoqCVRoZSBlcnJvciBpcyByZXBvcnRlZCB2aWE6CioJIC0gTWlzY0VyciB0YWxseSBvZiB0aGUgSENGIFRhbGx5IHNldAoqCSAtIHRoZSAoaW5mb3JtYXRpdmUpIGZpZWxkcyBJRkJfRXJyQ21kIGFuZCBJRkJfRXJyUXVhbGlmaWVyCioJIC0gdGhlIGFzc2VydCBtZWNoYW5pc20KKjg6CUhlcmUgdGhlIERlZnVuY3QgY2FzZSBhbmQgdGhlIFN0YXR1cyBlcnJvciBhcmUgc2VwYXJhdGVseSB0cmVhdGVkCioKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKY21kX2NtcGwoIElGQlAgaWZicCApCnsKClBST1RfQ05UX0lOSQppbnQJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNglzdGF0OwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ01EX0NQTCwgaWZicC0+SUZCX0NtZCApCglpZmJwLT5JRkJfQ21kICY9IH5IQ01EX0JVU1k7CQkJCQkJCQkJCQkJLyogMiAqLwoJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwkJCQkJLyogNCAqLwoJc3RhdCA9IElQVyggSFJFR19TVEFUICk7CiNpZiBIQ0ZfUFJPVF9USU1FCglpZiAoIHByb3RfY250ID09IDAgKSB7CgkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKys7ICkKCQlyYyA9IEhDRl9FUlJfVElNRV9PVVQ7CgkJSENGQVNTRVJUKCBET19BU1NFUlQsIGlmYnAtPklGQl9DbWQgKQoJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCgl7CgkJREFXQV9BQ0soIEhSRUdfRVZfQ01EICk7Ci8qNCovCWlmICggc3RhdCAhPSAoaWZicC0+SUZCX0NtZCAmIEhDTURfQ01EX0NPREUpICkgewovKjgqLwkJaWYgKCAoIChzdGF0IF4gaWZicC0+SUZCX0NtZCApICYgSENNRF9DTURfQ09ERSkgIT0gMCApIHsKCQkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX0NNRF9TRVE7CgkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJCX0KCQkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKys7ICkKCQkJaWZicC0+SUZCX0VyckNtZCA9IHN0YXQ7CgkJCWlmYnAtPklGQl9FcnJRdWFsaWZpZXIgPSBJUFcoIEhSRUdfUkVTUF8wICk7CgkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBJUFcoIEhSRUdfUEFSQU1fMCApLCBpZmJwLT5JRkJfQ21kICkgKQoJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggaWZicC0+SUZCX0VyclF1YWxpZmllciwgaWZicC0+SUZCX0VyckNtZCApICkKCQl9Cgl9CglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYykKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfQ1BMICkKCXJldHVybiByYzsKfSAvLyBjbWRfY21wbAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IGNtZF9leGUoIElGQlAgaWZicCwgaW50IGNtZF9jb2RlLCBpbnQgcGFyXzAgKQoqLlBVUlBPU0UJCUV4ZWN1dGVzIHN5bmNocm9ub3VzIHBhcnQgb2YgSGVybWVzIENvbW1hbmQgYW5kIC0gb3B0aW9uYWxseSAtIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgljbWRfY29kZQoqCXBhcl8wCioKKi5SRVRVUk5TCioJSUZCX0RlZnVuY3RTdGF0CioJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKglIQ0ZfU1VDQ0VTUwoqCUhDRl9FUlJfVE9fQkVfQURERUQJPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwKKgoqLkRFU0NSSVBUSU9OCiogRXhlY3V0ZXMgc3luY2hyb25vdXMgSGVybWVzIENvbW1hbmQgYW5kIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24KKgoqIFRoZSBnZW5lcmFsIEhDRiBzdHJhdGVneSBpcyB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24uIEFzIGEgY29uc2VxdWVuY2U6CiogLSB0aGUgcmVhZCBvZiB0aGUgYnVzeSBiaXQgYmVmb3JlIHdyaXRpbmcgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgaXMgc3VwZXJmbHVvdXMKKiAtIHRoZSBIZXJtZXMgcmVxdWlyZW1lbnQgdGhhdCBubyBJbnF1aXJ5IGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkIGlmIHRoZXJlIGlzIHN0aWxsIGFuIHVuYWNrbm93bGVkZ2VkCioJSW5xdWlyeSBjb21tYW5kIG91dHN0YW5kaW5nLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KKiBUaGUgVHggY29tbWFuZCB1c2VzIHRoZSAiQnVzeSIgYml0IGluIHRoZSBjbWRfY29kZSBwYXJhbWV0ZXIgdG8gZGV2aWF0ZSBmcm9tIHRoaXMgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kuCiogVGhlIGlkZWEgaXMgdGhhdCBieSBub3QgYnVzeS13YWl0aW5nIG9uIGNvbXBsZXRpb24gb2YgdGhpcyBmcmVxdWVudGx5IHVzZWQgY29tbWFuZCB0aGUgcHJvY2Vzc29yCiogdXRpbGl6YXRpb24gaXMgZGltaW5pc2hlZCB3aGlsZSB1c2luZyB0aGUgYnVzeS13YWl0IG9uIGFsbCBvdGhlciBzZWxkb20gdXNlZCBjb21tYW5kcyB0aGUgZmxvdyBpcyBrZXB0Ciogc2ltcGxlLgoqCioKKgoqLkRJQUdSQU0KKgoqMToJc2tpcCB0aGUgYm9keSBvZiBjbWRfZXhlIHdoZW4gaW4gZGVmdW5jdCBtb2RlIG9yIHdoZW4gLSBiYXNlZCBvbiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgd3JpdGUgYW5kCioJcmVhZCBiYWNrIHRlc3QgLSB0aGVyZSBpcyBhcHBhcmVudGx5IG5vIE5JQy4KKglOb3RlOiB3ZSBnYXZlIHVwIG9uIHRoZSAib2xkIiBzdHJhdGVneSB0byB3cml0ZSB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgYXQgbWFnaWMgb25seSB3aGVuIG5lZWRlZC4gRHVlIHRvCioJdGhlIGludHJpY2F0ZW5lc3Mgb2YgSGVybWVzIEYvVyB2YXJpZXRpZXMgKCB3aGljaCBiZWhhdmUgZGlmZmVyZW50bHkgYXMgZmFyIGFzIGNvcnJ1cHRpb24gb2YgdGhlIFMvVwoqCVN1cHBvcnQgcmVnaXN0ZXIgaXMgaW52b2x2ZWQpLCB0aGUgaW5jcmVhc2luZyBudW1iZXIgb2YgSGVybWVzIGNvbW1hbmRzIHdoaWNoIGRvIGFuIGltcGxpY2l0IGluaXRpYWxpemUKKgkodGh1cyBtb2RpZnlpbmcgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyKSBhbmQgdGhlIHdvcmthcm91bmRzIG9mIHNvbWUgT1MvU3VwcG9ydCBTL1cgaW5kdWNlZCBhc3BlY3RzIChlLmcuCioJdGhlIFN5c3RlbSBTb2Z0IGxpYnJhcnkgYXQgV2luTlQgd2hpY2ggcG9zdHBvbmVzIHRoZSBhY3R1YWwgbWFwcGluZyBvZiBJL08gc3BhY2UgdXAgdG8gMzAgc2Vjb25kcyBhZnRlcgoqCWdpdmluZyB0aGUgZ28tYWhlYWQpLCB0aGUgIm1hZ2ljIiBzdHJhdGVneSBpcyBub3cgcmVkdWNlZCB0byBhIHNpbXBsZSB3cml0ZSBhbmQgcmVhZCBiYWNrLiBUaGlzIG1lYW5zIHRoYXQKKglwcm9ibGVtcyBsaWtlIGEgYnVnIHRyYW1waW5nIG92ZXIgdGhlIG1lbW9yeSBtYXBwZWQgSGVybWVzIHJlZ2lzdGVycyB3aWxsIG5vIGxvbmdlciBiZSBub3RpY2VkIGFzIHNpZGUKKgllZmZlY3Qgb2YgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGNoZWNrLgoqMjoJY2hlY2sgd2hldGhlciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQgc2tpcHBlZCB0aGUgYnVzeSB3YWl0IGFuZCBpZiBzbywgY2hlY2sgZm9yIGNvbW1hbmQgY29tcGxldGlvbgoqCiouTk9USUNFCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKSENGX1NUQVRJQyBpbnQKY21kX2V4ZSggSUZCUCBpZmJwLCBoY2ZfMTYgY21kX2NvZGUsIGhjZl8xNiBwYXJfMCApCS8vaWYgSENNRF9CVVNZIG9mIGNtZF9jb2RlIHNldCwgdGhlbiBkbyBOT1Qgd2FpdCBmb3IgY29tcGxldGlvbgp7CmludCByYzsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9FWEUsIGNtZF9jb2RlICkKCUhDRkFTU0VSVCggKGNtZF9jb2RlICYgSENNRF9DTURfQ09ERSkgIT0gSENNRF9UWCB8fCBjbWRfY29kZSAmIEhDTURfQlVTWSwgY21kX2NvZGUgKSAvL1R4IG11c3QgaGF2ZSBCdXN5IGJpdCBzZXQKCU9QVyggSFJFR19TV18wLCBIQ0ZfTUFHSUMgKTsKCWlmICggSVBXKCBIUkVHX1NXXzAgKSA9PSBIQ0ZfTUFHSUMgKSB7CQkJCQkJCQkJCQkJCQkvKiAxICovCgkJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQ7Cgl9CgllbHNlIHJjID0gSENGX0VSUl9OT19OSUM7CglpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAovKjIqLwlpZiAoIGlmYnAtPklGQl9DbWQgJiBIQ01EX0JVU1kgKSB7CgkJCXJjID0gY21kX2NtcGwoIGlmYnAgKTsKCQl9CgkJT1BXKCBIUkVHX1BBUkFNXzAsIHBhcl8wICk7CgkJT1BXKCBIUkVHX0NNRCwgY21kX2NvZGUgJn5IQ01EX0JVU1kgKTsKCQlpZmJwLT5JRkJfQ21kID0gY21kX2NvZGU7CgkJaWYgKCAoY21kX2NvZGUgJiBIQ01EX0JVU1kpID09IDAgKSB7CS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAoJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CgkJfQoJfQoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgTUVSR0VfMiggcmMsIGNtZF9jb2RlICkgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0NNRF9FWEUgKQoJcmV0dXJuIHJjOwp9IC8vIGNtZF9leGUKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQoqLlBVUlBPU0UJCWRvd25sb2FkcyBGL1cgaW1hZ2UgaW50byBOSUMgYW5kIGluaXRpYXRlcyBleGVjdXRpb24gb2YgdGhlIGRvd25sb2FkZWQgRi9XLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJc3BlY2lmaWVzIHRoZSBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKgoqLlJFVFVSTlMKKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKjE6CUZpcnN0LCBBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKKglOb3RlIDE6IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSAoU2VuZCkgQ21kIGV2ZW50IGlzCioJcGVuZGluZwoqCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KKglIZXJtZXMgSW5pdGlhbGl6ZQoqCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmRvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCQkJCQkJLy9IZXJtZXMtSUkgZG93bmxvYWQgKHZvbGF0aWxlIG9ubHkpCnsKaGNmXzE2CQkJCWk7CmludAkJCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKd2NpX2J1ZnAJCQljcDsKaGNmX2lvCQkJCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19BVVhfREFUQTsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RMLCBsdHZwLT50eXAgKQojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRAoJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPm1vZGUgKQojZWxzZQoJCQkJCQkJCQkJCQkJLy9pZiBpbml0aWFsICJwcm9ncmFtIiBMVFYKCWlmICggaWZicC0+SUZCX0RMTW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKCQkJCQkJCQkJCQkJCS8vLiAgc3dpdGNoIEhlcm1lcyB0byBpbml0aWFsIG1vZGUKLyoxKi8JT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CgkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0lOSSwgMCApOwkvKiBIQ01EX0lOSSBjYW4gbm90IGJlIHBhcnQgb2YgaW5pdCgpIGJlY2F1c2UgdGhhdCBpcyBjYWxsZWQgb24KCQkJCQkJCQkJCQkgKiBvdGhlciBvY2Nhc2lvbnMgYXMgd2VsbCAqLwoJCXJjID0gaW5pdCggaWZicCApOwoJfQoJCQkJCQkJCQkJCQkJLy9pZiBmaW5hbCAicHJvZ3JhbSIgTFRWCglpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7CgkJCQkJCQkJCQkJCQkvLy4gIHN0YXJ0IHRlcnRpYXJ5IChvciBzZWNvbmRhcnkpCgkJT1BXKCBIUkVHX1BBUkFNXzEsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2KSApOwoJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9FWEVDVVRFLCAoaGNmXzE2KSBsdHZwLT5uaWNfYWRkciApOwoJCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgewoJCQlyYyA9IGluaXQoIGlmYnAgKTsJLyo7PyBkbyB3ZSByZWFsbHkgd2FudCB0byBza2lwIGluaXQgaWYgY21kX2V4ZSBmYWlsZWQsIGkuZS4KCQkJCQkJCQkgKgkgSUZCX0ZXX0NvbXBfSWQgaXMgdGhhbiBwb3NzaWJseSBpbmNvcnJlY3QgKi8KCSAgCX0KCQkJCQkJCQkJCQkJCS8vZWxzZSAobm9uLWZpbmFsKQoJfSBlbHNlIHsKCQkJCQkJCQkJCQkJCS8vLiAgaWYgbW9kZSA9PSBSZWFkYmFjayBTRUVQUk9NCiNpZiAwCS8vOz8gYXMgbG9uZyBhcyB0aGUgbmV4dCBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKCQlpZiAoIDAgLypsZW4gaXMgZGVmaW5pdGVseSBub3Qgd2FudCB3ZSB3YW50Oz8qLyAmJiBsdHZwLT5tb2RlID09IENGR19QUk9HX1NFRVBST01fUkVBREJBQ0sgKSB7CgkJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKCQkJT1BXKCBIUkVHX1BBUkFNXzIsIE1VTF9CWV8yKGx0dnAtPmxlbiAtIDQpKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgcGVyZm9ybSBIZXJtZXMgcHJvZyBjbWQgd2l0aCBhcHByb3ByaWF0ZSBtb2RlIGJpdHMKCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1BST0dSQU0gfCBsdHZwLT5tb2RlLCAoaGNmXzE2KWx0dnAtPm5pY19hZGRyICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IGFjY29yZGluZyBSZXNwMC0xCgkJCU9QVyggSFJFR19BVVhfUEFHRSwgICBJUFcoIEhSRUdfUkVTUF8xKSApOwoJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgSVBXKCBIUkVHX1JFU1BfMCkgKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2V0IHVwIEwtZmllbGQgb2YgTFRWIGFjY29yZGluZyBSZXNwMgoJCQlpID0gKCBJUFcoIEhSRUdfUkVTUF8yICkgKyAxICkgLyAyOyAgLy8gaSBjb250YWlucyBtYXggYnVmZmVyIHNpemUgaW4gd29yZHMsIGEgcHJvYmFibHkgbm90IHZlcnkgdXNlZnVsIHBpZWNlIG9mIGluZm9ybWF0aW9uIDs/Ci8qTmljbydzIGNvZGUgYmFzZWQgb24gaSBpcyB0aGUgInJlYWwgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIgoJCQlpZiAoIGx0dnAtPmxlbiAtIDQgPCBpICkgcmMgPSBIQ0ZfRVJSX0xFTjsKCQkJZWxzZSBsdHZwLT5sZW4gPSBpICsgNDsKKi8KLyogUm9sYW5kcyBjb2RlIGJhc2VkIG9uIHRoZSBpZGVhIHRoYXQgYSBNU0Ygc2hvdWxkIG5vdCBhc2sgZm9yIG1vcmUgdGhhbiBpcyBhdmFpbGFibGUKCQkJLy8gY2hlY2sgaWYgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBleGNlZWRzIG1heCBidWZmZXIgc2l6ZQoJCQlpZiAoIGx0dnAtPmxlbiAtIDQgPiBpICkgewoJCQkJcmMgPSBIQ0ZfRVJSX0xFTjsKCQkJCWx0dnAtPmxlbiA9IGkgKyA0OwoJCQl9CiovCgkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgZGF0YSBmcm9tIE5JQyB2aWEgQVVYIHBvcnQgdG8gTFRWCgkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvKklOX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycyovCgkJCWkgPSBsdHZwLT5sZW4gLSA0OwoJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgkvLyAkJCBjaGFyCgkJCQkJCQkJCQkJCQkvLy4gIGVsc2UgKG5vbi1maW5hbCBwcm9ncmFtbWluZykKCQl9IGVsc2UKI2VuZGlmIC8vOz8gYXMgbG9uZyBhcyB0aGUgYWJvdmUgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCgkJewkJCQkJCQkJCQkJLy8uICAuICBnZXQgbnVtYmVyIG9mIHdvcmRzIHRvIHByb2dyYW0KCQkJSENGQVNTRVJUKCBsdHZwLT5zZWdtZW50X3NpemUsICpsdHZwLT5ob3N0X2FkZHIgKQoJCQlpID0gbHR2cC0+c2VnbWVudF9zaXplLzI7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgZGF0YSAod29yZHMpIGZyb20gTFRWIHZpYSBBVVggcG9ydCB0byBOSUMKCQkJY3AgPSAod2NpX2J1ZnApbHR2cC0+aG9zdF9hZGRyOwkJCQkJCS8vT1VUX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycwoJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBtb2RlID09IHZvbGF0aWxlIHByb2dyYW1taW5nCgkJCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgdmlhIEFVWCBwb3J0CgkJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2IDw8IDkgfCAobHR2cC0+bmljX2FkZHIgJiAweEZGRkYpID4+IDcgKSApOwoJCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyICYgMHgwMDdFKSApOwoJCQkJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7CQkvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCgkJCX0KCQl9Cgl9CglpZmJwLT5JRkJfRExNb2RlID0gbHR2cC0+bW9kZTsJCQkJCS8vc2F2ZSBzdGF0ZSBpbiBJRkJfRExNb2RlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETCApCglyZXR1cm4gcmM7Cn0gLy8gZG93bmxvYWQKCgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQ2VydGFpbiBIZXJtZXMtSUkgZmlybXdhcmUgdmVyc2lvbnMgY2FuIGdlbmVyYXRlCiogZGVidWcgaW5mb3JtYXRpb24uIFRoaXMgZGVidWcgaW5mb3JtYXRpb24gaXMKKiBjb250YWluZWQgaW4gYSBidWZmZXIgaW4gbmljLVJBTSwgYW5kIGNhbiBiZSByZWFkCiogdmlhIHRoZSBhdXggcG9ydC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmZ3X3ByaW50ZihJRkJQIGlmYnAsIENGR19GV19QUklOVEZfU1RSQ1QgRkFSICpsdHZwKQp7CiAgICBpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKICAgIGhjZl8xNiBmd19jbnQ7Ci8vICAgIGhjZl8zMiBEYk1zZ0J1ZmZlciA9IDB4MjlEMiwgRGJNc2dDb3VudD0gMHgwMDAwMjlEMDsKLy8gICAgaGNmXzE2IERiTXNnU2l6ZT0weDAwMDAwMDgwOwogICAgaGNmXzMyIERiTXNnQnVmZmVyOwogICAgQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QgKnAgPSAmaWZicC0+SUZCX0Z3UGZCdWZmOwogICAgbHR2cC0+bGVuID0gMTsKICAgIGlmICggcC0+RGJNc2dTaXplICE9IDAgKSB7CiAgICAgICAgLy8gZmlyc3QsIGNoZWNrIHRoZSBjb3VudGVyIGluIG5pYy1SQU0gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIGxhdGVzdCBjb3VudGVyIHZhbHVlIG9mIHRoZSBIQ0YKICAgICAgICBPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgPj4gNykgKTsKICAgICAgICBPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikocC0+RGJNc2dDb3VudCAmIDB4N0UpICk7CiAgICAgICAgZndfY250ID0gKChJUFcoIEhSRUdfQVVYX0RBVEEpID4+MSApICYgKChoY2ZfMTYpcC0+RGJNc2dTaXplIC0gMSkpOwogICAgICAgIGlmICggZndfY250ICE9IGlmYnAtPklGQl9EYmdQcmludEZfQ250ICkgewovLyAgICBEYmdQcmludCgiZndfY250PSVkIElGQl9EYmdQcmludEZfQ250PSVkXG4iLCBmd19jbnQsIGlmYnAtPklGQl9EYmdQcmludEZfQ250KTsKICAgICAgICAgICAgRGJNc2dCdWZmZXIgPSBwLT5EYk1zZ0J1ZmZlciArIGlmYnAtPklGQl9EYmdQcmludEZfQ250ICogNjsgLy8gZWFjaCBlbnRyeSBpcyAzIHdvcmRzCiAgICAgICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikoRGJNc2dCdWZmZXIgPj4gNykgKTsKICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKERiTXNnQnVmZmVyICYgMHg3RSkgKTsKICAgICAgICAgICAgbHR2cC0+bXNnX2lkICAgICA9IElQVyhIUkVHX0FVWF9EQVRBKTsKICAgICAgICAgICAgbHR2cC0+bXNnX3BhciAgICA9IElQVyhIUkVHX0FVWF9EQVRBKTsKICAgICAgICAgICAgbHR2cC0+bXNnX3RzdGFtcCA9IElQVyhIUkVHX0FVWF9EQVRBKTsKICAgICAgICAgICAgbHR2cC0+bGVuID0gNDsKICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQrKzsKICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgJj0gKHAtPkRiTXNnU2l6ZSAtIDEpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByYzsKfTsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWhjZl8xNiBnZXRfZmlkKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWdldCBhbGxvY2F0ZWQgRklEIGZvciBlaXRoZXIgdHJhbnNtaXQgb3Igbm90aWZ5LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJMAlubyBGSUQgYXZhaWxhYmxlCioJPD4wCUZJRCBudW1iZXIKKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKglUaGUgcHJlZmVyZW5jZSBpcyB0byB1c2UgYSAicGVuZGluZyIgYWxsb2MuIElmIG5vIGFsbG9jIGlzIHBlbmRpbmcsIHRoZW4gLSBpZiBhdmFpbGFibGUgLSB0aGUgInNwYXJlIiBGSUQKKglpcyB1c2VkLgoqCUlmIHRoZSBzcGFyZSBGSUQgaXMgdXNlZCwgSUZCX1JzY0luZCAocmVwcmVzZW50aW5nIHRoZSBzcGFyZSBGSUQpIG11c3QgYmUgY2xlYXJlZAoqCUlmIHRoZSBwZW5kaW5nIGFsbG9jIGlzIHVzZWQsIHRoZSBhbGxvYyBldmVudCBtdXN0IGJlIGFja25vd2xlZGdlZCB0byB0aGUgSGVybWVzLgoqCUluIGNhc2UgdGhlIHNwYXJlIEZJRCB3YXMgZGVwbGV0ZWQgYW5kIHRoZSBJRkJfUnNjSW5kIGhhcyBiZWVuICJmYWtlZCIgYXMgcHNldWRvIHJlc291cmNlIHdpdGggYSAweDAwMDEKKgl2YWx1ZSBieSBoY2Zfc2VydmljZV9uaWMsIElGQl9Sc2NJbmQgaGFzIHRvIGJlICJjb3JyZWN0ZWQiIGFnYWluIHRvIGl0cyAweDAwMDAgdmFsdWUuCioKKglOb3RlIHRoYXQgZHVlIHRvIHRoZSBIZXJtZXMtSUkgSC9XIHByb2JsZW1zIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSB3b3JrZWQgYXJvdW5kIGJ5IERBV0EsIHRoZSBBbGxvYyBiaXQKKglpbiB0aGUgRXZlbnQgcmVnaXN0ZXIgaXMgbm8gbG9uZ2VyIGEgcmVsaWFibGUgaW5kaWNhdGlvbiBvZiB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiBhIEZJRC4gVGhlICJDbGVhciBGSUQiCioJcGFydCBvZiB0aGUgREFXQSBsb2dpYywgdG9nZXRoZXIgd2l0aCB0aGUgY2hvaWNlIG9mIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZXR1cm4gaW5mb3JtYXRpb24gZnJvbSBnZXRfZmlkLAoqCWhhbmRsZSB0aGlzIGF1dG9tYXRpY2FsbHksIGkuZS4gd2l0aG91dCBhZGRpdGlvbmFsIGNvZGUgaW4gZ2V0X2ZpZC4KKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaGNmXzE2CmdldF9maWQoIElGQlAgaWZicCApCnsKCmhjZl8xNiBmaWQgPSAwOwojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKUFJPVF9DTlRfSU5JCiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CgoJSUZfRE1BKCBIQ0ZBU1NFUlQoIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpLCBpZmJwLT5JRkJfQ250bE9wdCkgKQoKCWlmICggSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9BTExPQykgewoJCWZpZCA9IElQVyggSFJFR19BTExPQ19GSUQgKTsKCQlIQ0ZBU1NFUlQoIGZpZCwgaWZicC0+SUZCX1JzY0luZCApCgkJREFXQV9aRVJPX0ZJRCggSFJFR19BTExPQ19GSUQgKQojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BQ0tfUkVHX1JFQURZICkgPT0gMCApOwoJCUhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkgKQojZW5kaWYgLy8gSENGX1RZUEVfSElJNQoJCURBV0FfQUNLKCBIUkVHX0VWX0FMTE9DICk7CQkJLy8hIW5vdGUgdGhhdCBIUkVHX0VWX0FMTE9DIGlzIHdyaXR0ZW4gb25seSBvbmNlCi8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CgkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDEgKSB7CgkJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOwoJCX0KLy8jZW5kaWYgLy8gQUxMT0NfMTUKCX0gZWxzZSB7Ci8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CgkJZmlkID0gaWZicC0+SUZCX1JzY0luZDsKLy8jZW5kaWYgLy8gQUxMT0NfMTUKCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKCX0KCXJldHVybiBmaWQ7Cn0gLy8gZ2V0X2ZpZAojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKKi5QVVJQT1NFCQlyZWFkcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIE5JQyBSQU0gdG8gSG9zdCBtZW1vcnkuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioJd29yZF9sZW4JQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSByZWFkIGJ5IHRoZSBwcmV2aW91cyBnZXRfZnJhZyBhbmQgY29weSBsZW4gKG9yIGxlbi0xKSBieXRlcyBmcm9tCiogTklDIHRvIGJ1ZnAuCiogT24gYSBCaWcgRW5kaWFuIHBsYXRmb3JtLCB0aGUgcGFyYW1ldGVyIHdvcmRfbGVuIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB3aG9zZSBlbmRpYW5lc3MgaXMKKiBjb252ZXJ0ZWQgKGkuZS4gYnl0ZSBzd2FwcGVkKQoqCioKKi5ESUFHUkFNCioxMDogVGhlIFBDTUNJQSBjYXJkIGNhbiBiZSByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRyYW5zZmVyLiBCeSBkZXBvc2l0aW5nIGEgIm1hZ2ljIG51bWJlciIgaW4gdGhlCioJSFJFR19TV18wIHJlZ2lzdGVyIG9mIHRoZSBIZXJtZXMgYXQgaW5pdGlhbGl6YXRpb24gdGltZSBhbmQgYnkgdmVyaWZ5aW5nIHRoaXMgcmVnaXN0ZXIsIGl0IGNhbiBiZQoqCWRldGVybWluZWQgd2hldGhlciB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LiBUaGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgYWNjb3JkaW5nbHkuCioJQ2xlYXJpbmcgdGhlIGJ1ZmZlciBpcyBhIChyZWxhdGl2ZSkgY2hlYXAgd2F5IHRvIHByZXZlbnQgdGhhdCBmYWlsaW5nIEkvTyByZXN1bHRzIGluIHJ1bi1hd2F5IGJlaGF2aW9yCioJYmVjYXVzZSB0aGUgZ2FyYmFnZSBpbiB0aGUgYnVmZmVyIGlzIGludGVycHJldGVkIGJ5IHRoZSBjYWxsZXIgaXJyZXNwZWN0aXZlIG9mIHRoZSByZXR1cm4gc3RhdHVzIChlLmcuCioJaGNmX3NlcnZpY2VfbmljIGhhcyB0aGlzIGJlaGF2aW9yKS4KKgoqLk5PVElDRQoqCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCioJQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKewpoY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKd2NpX2J1ZnAJcCA9IGJ1ZnA7CQkJCQkJCQkJLy93b3JraW5nIHBvaW50ZXIKaW50CQkJaTsJCQkJCQkJCQkJCS8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwppbnQJCQlqOwoKCUhDRkFTU0VSVCggKChoY2ZfMzIpYnVmcCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQoKLyoxOgloZXJlIHJlY292ZXJ5IGxvZ2ljIGZvciBpbnRlcnZlbmluZyBCQVAgYWNjZXNzIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZCBoY2ZfcmN2X21zZyBDT1VMRCBiZSBhZGRlZAogKiAJaWYgY3VycmVudCBhY2Nlc3MgaXMgUnhJbml0aWFsCiAqIAkuICBwZXJzaXN0ZW50X29mZnNldCArPSBsZW4KICovCgoJaSA9IGxlbjsKCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+IDAgYW5kIGNhcnJ5IGZyb20gcHJldmlvdXMgZ2V0X2ZyYWcKCWlmICggaSAmJiBpZmJwLT5JRkJfQ2FycnlJbiApIHsKCQkJCQkJCQkJCQkJCS8vLiAgbW92ZSBjYXJyeSB0byBidWZmZXIKCQkJCQkJCQkJCQkJCS8vLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkqcCsrID0gKGhjZl84KShpZmJwLT5JRkJfQ2FycnlJbj4+OCk7CgkJaS0tOwoJCQkJCQkJCQkJCQkJLy8uICBjbGVhciBjYXJyeSBmbGFnCgkJaWZicC0+SUZCX0NhcnJ5SW4gPSAwOwoJfQojaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCgkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+PSA2IGFuZCAzMiBiaXRzIEkvTyBzdXBwb3J0CglpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKaGNmXzMyIEZBUgkqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwoJCWlmICggKCAoaGNmXzMyKXAgJiAweDEgKSA9PSAwICkgewkJCS8vLiAgaWYgYnVmZmVyIGF0IGxlYXN0IHdvcmQgYWxpZ25lZAoJCQlpZiAoIChoY2ZfMzIpcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcmVhZCBzaW5nbGUgd29yZCB0byBnZXQgZG91YmxlIHdvcmQgYWxpZ25lZAoJCQkJKih3Y2lfcmVjb3JkcClwID0gSU5fUE9SVF9XT1JEKCBpb19wb3J0ICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCQlwICs9IDI7CgkJCQlpIC09IDI7CgkJCX0KCQkJCQkJCQkJCQkJCS8vLiAgLiAgcmVhZCBhcyBtYW55IGRvdWJsZSB3b3JkIGFzIHBvc3NpYmxlCgkJCXA0ID0gKGhjZl8zMiBGQVIgKilwOwoJCQlqID0gaS80OwoJCQlJTl9QT1JUX1NUUklOR18zMiggaW9fcG9ydCwgcDQsIGogKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJcCArPSBpICYgfjB4MDAwMzsKCQkJaSAmPSAweDAwMDM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0lPXzMyQklUUwoJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMS0zIGJ5dGVzIGxlZnQKCWlmICggaSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgcmVhZCBhcyBtYW55IHdvcmQgYXMgcG9zc2libGUgaW4gImFsaWdubWVudCBzYWZlIiB3YXkKCQlqID0gaS8yOwoJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHAsIGogKTsKCQkJCQkJCQkJCQkJCS8vLiAgaWYgMSBieXRlIGxlZnQKCQlpZiAoIGkgJiAweDAwMDEgKSB7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgMSB3b3JkCgkJCWlmYnAtPklGQl9DYXJyeUluID0gSU5fUE9SVF9XT1JEKCBpb19wb3J0ICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHN0b3JlIExTQiBpbiBsYXN0IGNoYXIgb2YgYnVmZmVyCgkJCWJ1ZnBbbGVuLTFdID0gKGhjZl84KWlmYnAtPklGQl9DYXJyeUluOwoJCQkJCQkJCQkJCQkJLy8uICAuICBzYXZlIE1TQiBpbiBjYXJyeSwgc2V0IGNhcnJ5IGZsYWcKCQkJaWZicC0+SUZCX0NhcnJ5SW4gfD0gMHgxOwoJCX0KCX0KI2lmIEhDRl9CSUdfRU5ESUFOCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQoJSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFMiggd29yZF9sZW4sIGxlbiApICkKCS8vc2VlIHB1dF9mcmFnIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGJlIGNhcmVmdWwgYWJvdXQgd2hhdCBhcmUgaW50J3MgYW5kIHdoYXQgYXJlCgkvL2hjZl8xNidzCglpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CmhjZl84IGM7CgkJYyA9IGJ1ZnBbMV07CQkJCQkJCQkvLy4gIC4gIGNvbnZlcnQgdGhlIDFzdCBoY2ZfMTYKCQlidWZwWzFdID0gYnVmcFswXTsKCQlidWZwWzBdID0gYzsKCQlpZiAoIHdvcmRfbGVuID4gMSApIHsJCQkJCQkvLy4gIC4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKCQkJYyA9IGJ1ZnBbM107CQkJCQkJCS8vLiAgLiAgLiAgY29udmVydCB0aGUgMm5kIGhjZl8xNgoJCQlidWZwWzNdID0gYnVmcFsyXTsKCQkJYnVmcFsyXSA9IGM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KfSAvLyBnZXRfZnJhZwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgaW5pdCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQlIYW5kbGVzIGNvbW1vbiBpbml0aWFsaXphdGlvbiBhc3BlY3RzIChILUkgaW5pdCwgY2FsaWJyYXRpb24sIGNvbmZpZy5tbmdtdCwgYWxsb2NhdGlvbikuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKglIQ0ZfRVJSX0lOQ09NUF9GVwoqCUhDRl9FUlJfVElNRV9PVVQKKgk+PmhjZl9nZXRfaW5mbwoqCQlIQ0ZfRVJSX05PX05JQwoqCQlIQ0ZfRVJSX0xFTgoqCiouREVTQ1JJUFRJT04KKiBpbml0IHdpbGwgc3VjY2Vzc2l2ZWx5OgoqIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQwoqIC0gY2FsaWJyYXRlIHRoZSBTL1cgcHJvdGVjdGlvbiB0aW1lciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIKKiAtIGNvbGxlY3QgSFNJLCAiYWN0aXZlIiBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiogLSBjaGVjayBIU0kgYW5kIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgU3RhdGlvbiBvciBBUCBGL1c6IGNoZWNrIFN0YXRpb24gb3IgQVAgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKKgoqCiouRElBR1JBTQoqMjoJZHJvcCBhbGwgZXJyb3Igc3RhdHVzIGJpdHMgaW4gSUZCX0NhcmRTdGF0IHNpbmNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHJlLWV2YWx1YXRlZC4KKjQ6CUFjayBldmVyeXRoaW5nIGV4Y2VwdCBIUkVHX0VWX1NMRUVQX1JFUS4gSXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZAoqCXZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgU2VuZCBDbWQgZXZlbnQgaXMgcGVuZGluZy4gQWNraW5nIEhSRUdfRVZfU0xFRVBfUkVRIGlzIGhhbmRsZWQgYnkgaGNmX2FjdGlvbigKKglIQ0ZfQUNUX0lOVF9PTiApICEhIQoqMTA6IENhbGlicmF0ZSB0aGUgUy9XIHRpbWUtb3V0IHByb3RlY3Rpb24gbWVjaGFuaXNtIGJ5IGNhbGxpbmcgY2FsaWJyYXRlKCkuIE5vdGUgdGhhdCBwb3NzaWJsZSBlcnJvcnMKKglpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCioJc3Vic2VxdWVudCBoY2YtY2FsbHMuCioxNDogdXNiX2NoZWNrX2NvbXAoKSBpcyBjYWxsZWQgdG8gaGF2ZSB0aGUgbWluaW1hbCB2aXN1YWwgY2x1dHRlciBmb3IgdGhlIGxlZ2FjeSBILUkgVVNCIGRvbmdsZQoqCWNvbXBhdGliaWxpdHkgY2hlY2suCioxNjogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDOgoqCSAtIEhTSSBzdXBwbGllcgoqCSAtIEYvVyBJZGVudGl0eQoqCSAtIEYvVyBzdXBwbGllcgoqCSBpZiBhcHByb3ByaWF0ZToKKgkgLSBQUkkgSWRlbnRpdHkKKgkgLSBQUkkgc3VwcGxpZXIKKgkgYXBwcm9wcmlhdGUgbWVhbnMgb24gSC1JOiBhbHdheXMKKgkgYW5kIG9uIEgtSUkgaWYgRi9XIHN1cHBsaWVyIHJlZmxlY3RzIGEgcHJpbWFyeSAoaS5lLiBvbmx5IGFmdGVyIGFuIEhlcm1lcyBSZXNldCBvciBJbml0CioJIGNvbW1hbmQpLgoqCSBRVUVTVElPTiA7PyAhISEhISEgc2hvdWxkLCBGb3IgZWFjaCBvZiB0aGUgYWJvdmUgUklEcyB0aGUgRW5kaWFuZXNzIGlzIGNvbnZlcnRlZCB0byBuYXRpdmUgRW5kaWFuZXNzLgoqCSBPbmx5IHRoZSByZXR1cm4gY29kZSBvZiB0aGUgZmlyc3QgaGNmX2dldF9pbmZvIGlzIHVzZWQuIEFsbCBoY2ZfZ2V0X2luZm8gY2FsbHMgYXJlIG1hZGUsIHJlZ2FyZGxlc3Mgb2YKKgkgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgMXN0IGhjZl9nZXRfaW5mby4gVGhlIGFzc3VtcHRpb25zIGFyZToKKgkgIC0gaWYgYW55IGNhbGwgZmFpbHMsIHRoZXkgYWxsIGZhaWwsIHNvIHJlbWVtYmVyaW5nIHRoZSByZXN1bHQgb2YgdGhlIDFzdCBjYWxsIGlzIGFkZXF1YXRlCioJICAtIGEgZmFpbGluZyBjYWxsIHdpbGwgb3ZlcndyaXRlIHRoZSBMLWZpZWxkIHdpdGggYSAweDAwMDAgdmFsdWUsIHdoaWNoIHNlcnZpY2VzIGJvdGggYXMgYW4KKgkJZXJyb3IgaW5kaWNhdGlvbiBmb3IgdGhlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIElGQiBhcyBtYWtpbmcgbW1kX2NoZWNrX2NvbXAgZmFpbC4KKgkgSW4gY2FzZSBvZiBILUksIHdoZW4gZ2V0dGluZyB0aGUgRi9XIGlkZW50aXR5IGZhaWxzLCB0aGUgRi9XIGlzIGFzc3VtZWQgdG8gYmUgSC1JIEFQIEYvVyBwcmUtZGF0aW5nCioJIHZlcnNpb24gOS4wIGFuZCB0aGUgRi9XIElkZW50aXR5IGFuZCBTdXBwbGllciBhcmUgZmFrZWQgYWNjb3JkaW5nbHkuCioJIEluIGNhc2Ugb2YgSC1JSSwgdGhlIFByaW1hcnksIFN0YXRpb24gYW5kIEFQIElkZW50aXR5IGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBGL1cgSWRlbnRpdHkuCioJIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIFN1cHBsaWVyIGluZm9ybWF0aW9uLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBQUkkgaW5mb3JtYXRpb24gY2FuIG5vIGxvbmdlciBiZQoqCSByZXRyaWV2ZWQgd2hlbiBhIFRlcnRpYXJ5IHJ1bnMuIFRvIGFjY29tbW9kYXRlIE1TRnMgYW5kIFV0aWxpdGllcyB3aG8gZGVwZW5kIG9uIFBSSSBpbmZvcm1hdGlvbiBiZWluZwoqCSBhdmFpbGFibGUgYXQgYW55IHRpbWUsIHRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIGluIHRoZSBJRkIuIEluIHRoaXMgY2FjaGUgdGhlIGdlbmVyaWMgIkYvVyIgdmFsdWUgb2YKKgkgdGhlIHR5cC1maWVsZHMgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgc3BlY2lmaWMgKGxlZ2FjeSkgIlBSSSIgdmFsdWVzLiBUbyBhY3R1YWxseSByZS1yb3V0ZSB0aGUgKGxlZ2FjeSkKKgkgUFJJIHJlcXVlc3QgdmlhIGhjZl9nZXRfaW5mbywgdGhlIHh4eHgtdGFibGUgbXVzdCBiZSBzZXQuICBJbiBjYXNlIG9mIEgtSSwgdGhpcyBjYWNoaW5nLCBtb2RpZnlpbmcgYW5kCioJIHJlLXJvdXRpbmcgaXMgbm90IG5lZWRlZCBiZWNhdXNlIFBSSSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIE5JQy4gRm9yCioJIGNvbnNpc3RlbmN5IHRoZSBjYWNoaW5nIGZpZWxkcyBpbiB0aGUgSUZCIGFyZSBmaWxsZWQgd2l0aCB0aGUgUFJJIGluZm9ybWF0aW9uIGFueXdheS4KKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCioJUHJpbWFyeSBGaXJtd2FyZSBWYXJpYW50IGFuZCBSYW5nZSBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhpcyBIQ0YuICBJZiBlaXRoZXIgb2YKKgl0aGVzZSB0ZXN0cyBmYWlscywgdGhlIENBUkRfU1RBVF9JTkNPTVBfUFJJIGJpdCBvZiBJRkJfQ2FyZFN0YXQgaXMgc2V0CioJTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQoqCXVuc3VpdGFibGUgZm9yIG1hbnVmYWN0dXJpbmcgdGVzdCBzeXN0ZW1zIGxpa2UgdGhlIEZUUy4gVGhpcyBjYW4gYmUgcmVtZWRpZWQgYnkgYW4gYWRkaW5nIGEgdGVzdCBsaWtlCioJaWZicC0+SUZCX1BSSVN1cC5pZCA9PSBDT01QX0lEX1BSSQoqMjA6IEluIGNhc2UgdGhlcmUgaXMgVGVydGlhcnkgRi9XIGFuZCB0aGlzIEYvVyBpcyBTdGF0aW9uIEYvVywgdGhlIFN1cHBsaWVyIFZhcmlhbnQgYW5kIFJhbmdlIG9mIHRoZSBTdGF0aW9uCioJRmlybXdhcmUgZnVuY3Rpb24gYXMgcmV0cmlldmVkIGZyb20gdGhlIEhlcm1lcyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIFRvcCBhbmQgQm90dG9tIGxldmVsIHN1cHBvcnRlZCBieQoqCXRoaXMgSENGLgoqCU5vdGU6IDs/IHRoZSB0ZXJ0aWFyeSBGL1cgY29tcGF0aWJpbGl0eSBjaGVja3MgY291bGQgYmUgbW92ZWQgdG8gdGhlIERIRiwgd2hpY2ggYWxyZWFkeSBoYXMgY2hlY2tlZCB0aGUKKglDRkkgYW5kIE1GSSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBOSUMgYmVmb3JlIHRoZSBpbWFnZSB3YXMgZG93bmxvYWRlZC4KKjI4OiBJbiBjYXNlIG9mIG5vbi1QcmltYXJ5IEYvVzogYWxsb2NhdGVzIGFuZCBhY2tub3dsZWRnZSBhIChUWCBvciBOb3RpZnkpIEZJRCBhbmQgYWxsb2NhdGVzIHdpdGhvdXQKKglhY2tub3dsZWRnZSBhbm90aGVyIChUWCBvciBOb3RpZnkpIEZJRCAodGhlIHNvLWNhbGxlZCAxLjUgYWxsb2Mgc2NoZW1lKSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6CioJLSBleGVjdXRlIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGJ5IGNhbGxpbmcgY21kX2V4ZQoqCS0gd2FpdCB0aWxsIGVpdGhlciB0aGUgYWxsb2MgZXZlbnQgb3IgYSB0aW1lLW91dCBvY2N1cnMKKgktIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgYWxsb2MgZXZlbnQgb2NjdXJzLCBjYWxsIGdldF9maWQgdG8KKgkgIC0gcmVhZCB0aGUgRklEIGFuZCBzYXZlIGl0IGluIElGQl9Sc2NJbmQgdG8gYmUgdXNlZCBhcyAic3BhcmUgRklEIgoqCSAgLSBhY2tub3dsZWRnZSB0aGUgYWxsb2MgZXZlbnQKKgkgIC0gZG8gYW5vdGhlciAiaGFsZiIgYWxsb2NhdGUgdG8gY29tcGxldGUgdGhlICIxLjUgQWxsb2Mgc2NoZW1lIgoqCSAgTm90ZSB0aGF0IGFib3ZlIDMgc3RlcHMgZG8gbm90IGhhcm0gYW5kIHRodXMgZ2l2ZSB0aGUgImNoZWFwZXN0IiBhY2NlcHRhYmxlIHN0cmF0ZWd5LgoqCSAgSWYgYSB0aW1lLW91dCBvY2N1cnJlZCwgdGhlbiByZXBvcnQgdGltZSBvdXQgc3RhdHVzIChhZnRlciBhbGwpCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmluaXQoIElGQlAgaWZicCApCnsKCmludAlyYyA9IEhDRl9TVUNDRVNTOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfSU5JVCwgMCApCgoJaWZicC0+SUZCX0NhcmRTdGF0ID0gMDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogMiovCglPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsgCQkJCQkJCQkJCQkvKiA0Ki8KCUlGX1BST1RfVElNRSggY2FsaWJyYXRlKCBpZmJwICk7ICkgCQkJCQkJCQkJCQkJCS8qMTAqLwojaWYgMCAvLyBPT1IKCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IDI7CQkJCQkJCS8vbWlzdXNlIHRoZSBJRkIgc3BhY2UgZm9yIGEgcHV0CglpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfVElDS19USU1FOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9ICgxMDAwKjEwMDApLzEwMjQgKyAxOwkvL3JvdWdobHkgMSBzZWNvbmQKCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOwojZW5kaWYgLy8gT09SCglpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSBzaXplb2YoQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CglpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfRldfSURFTlRJVFk7CglyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOwovKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLwojaWYgSENGX0JJR19FTkRJQU4KCWlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICk7CglpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmFyaWFudCApOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yICk7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECQkJCQkJCQkJCQkJCQkJCQkJLyoxNCovCglpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewkJCQkJCQkJCQkJCQkJCQkJCS8qMTYqLwoJCWlmYnAtPklGQl9IU0lTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCQlpZmJwLT5JRkJfSFNJU3VwLnR5cCA9IENGR19OSUNfSFNJX1NVUF9SQU5HRTsKCQlyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9IU0lTdXAubGVuICk7Ci8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICwgQlVUIGFjY29yZGluZyB0byBhIHJlcG9ydCBvZiBhIEJFLXVzZXIgaXQgaXMKICogc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBXQVJQIHJlbGVhc2UKICogc2luY2Ugc29tZSBjb21waWxlcnMgbWFrZSB1Z2x5IGJ1dCB1bm5lY2Vzc2FyeSBjb2RlIG9mIHRoZXNlIGluc3RydWN0aW9ucyBldmVuIGZvciBMRSwKICogaXQgaXMgY29uZGl0aW9uYWxseSBjb21waWxlZCAqLwojaWYgSENGX0JJR19FTkRJQU4KCQlpZmJwLT5JRkJfSFNJU3VwLnJvbGUgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnJvbGUgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmlkICk7CgkJaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ICk7CgkJaWZicC0+SUZCX0hTSVN1cC5ib3R0b20gID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5ib3R0b20gKTsKCQlpZmJwLT5JRkJfSFNJU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnRvcCApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCQlpZmJwLT5JRkJfRldTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCQlpZmJwLT5JRkJfRldTdXAudHlwID0gQ0ZHX0ZXX1NVUF9SQU5HRTsKCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldTdXAubGVuICk7Ci8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICovCiNpZiBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9GV1N1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnJvbGUgKTsKCQlpZmJwLT5JRkJfRldTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5pZCApOwoJCWlmYnAtPklGQl9GV1N1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgKTsKCQlpZmJwLT5JRkJfRldTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5ib3R0b20gKTsKCQlpZmJwLT5JRkJfRldTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC50b3AgKTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCgoJCWlmICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfUFJJICkgewkJCQkJCQkJCQkJCS8qIDIwKi8KaW50IGkgPSBzaXplb2YoIENGR19GV19JREVOVElUWV9TVFJDVCkgKyBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCApOwoJCQl3aGlsZSAoIGktLSApICgoaGNmXzgqKSgmaWZicC0+SUZCX1BSSUlkZW50aXR5KSlbaV0gPSAoKGhjZl84KikoJmlmYnAtPklGQl9GV0lkZW50aXR5KSlbaV07CgkJCWlmYnAtPklGQl9QUklJZGVudGl0eS50eXAgPSBDRkdfUFJJX0lERU5USVRZOwoJCQlpZmJwLT5JRkJfUFJJU3VwLnR5cCA9IENGR19QUklfU1VQX1JBTkdFOwoJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSAmaWZicC0+SUZCX1BSSUlkZW50aXR5LmxlbjsKCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSAmaWZicC0+SUZCX1BSSVN1cC5sZW47CgkJfQoJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKQkJCQkgLyogMjIqLwojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAovLzs/IHRoZSBQUkkgY29tcGF0aWJpbGl0eSBjaGVjayBpcyBvbmx5IHJlbGV2YW50IGZvciBESEYKCQkJIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJCSAgICkgewoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgPSBDQVJEX1NUQVRfSU5DT01QX1BSSTsKCQkJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9QUkk7CgkJfQoJCWlmICggKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9TVEEgJiYJIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEsICZpZmJwLT5JRkJfRldTdXApICkgfHwKCQkJICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfQVBGICYmICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmLCAmaWZicC0+SUZCX0ZXU3VwKSApCgkJICAgKSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjQgKi8KCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CgkJCXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CgkJfQoJfQojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDI4ICovCglpZiAoIHJjID09IEhDRl9TVUNDRVNTICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPj0gQ09NUF9JRF9GV19TVEEgKSB7ClBST1RfQ05UX0lOSQoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCgkJKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSByaWdodCBzcG90IGluIHRoZSBIQ0YsIHRoaW5raW5nIGFib3V0IGhjZl9lbmFibGUuLi4KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKLy8JCWlmYnAtPklGQl9Sc2NJbmQgPSAxOwkvL2xldCdzIGhvcGUgdGhhdCBieSB0aGUgdGltZSBoY2Zfc2VuZF9tc2cgaXNhIGNhbGxlZCwgdGhlcmUgd2lsbCBiZSBhIEZJRAovLyNlbHNlCgkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BTExPQykgPT0gMCApOwoJCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVChwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApIC8qTk9QKi87KQojaWYgSENGX0RNQQoJCQlpZiAoICEgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApCiNlbmRpZiAvLyBIQ0ZfRE1BCgkJCXsKCQkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQsIDAgKQoJCQkJY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwoJCQkJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ID09IDAgKSByYyA9IEhDRl9FUlJfVElNRV9PVVQ7ICkKCQkJfQoJCX0KLy8jZW5kaWYgLy8gQUxMT0NfMTUKCX0KI2VuZGlmIC8vIEhDRl9ETF9PTkxZCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfSU5JVCApCglyZXR1cm4gcmM7Cn0gLy8gaW5pdAoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgaXNyX2luZm8oIElGQlAgaWZicCApCiouUFVSUE9TRQkJaGFuZGxlcyBsaW5rIGV2ZW50cy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqMToJRmlyc3QgdGhlIEZJRCBudW1iZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBJbmZvRXZlbnQgaXMgZGV0ZXJtaW5lZC4KKglOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgoqCU5leHQgdGhlIEwtZmllbGQgYW5kIHRoZSBULWZpZWxkIGFyZSBmZXRjaGVkIGludG8gc2NyYXRjaCBidWZmZXIgaW5mby4KKjI6CUluIGNhc2Ugb2YgdGFsbGllcywgdGhlIDE2IGJpdHMgSGVybWVzIHZhbHVlcyBhcmUgYWNjdW11bGF0ZWQgaW4gdGhlIElGQiBpbnRvIDMyIGJpdHMgdmFsdWVzLiBJbmZvWzBdCioJaXMgKGV4cGVjdGVkIHRvIGJlKSBIQ0ZfTklDX1RBTF9DTlQgKyAxLiBUaGUgY29udHJhcHRpb24gIndoaWxlICggaW5mb1swXS0tID4xICkiIHJhdGhlciB0aGFuCioJIndoaWxlICggLS1pbmZvWzBdICkiIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyBkYW5nZXJvdXMgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFZhbHVlIGZpZWxkIGJ5CioJZGVjcmVtZW50aW5nIGluZm9bMF0uIEFzIGEgcmVzdWx0IG9mIGEgYnVnIGluIHNvbWUgdmVyc2lvbiBvZiB0aGUgRi9XLCBpbmZvWzBdIG1heSBiZSAwLCByZXN1bHRpbmcKKglpbiBhIHZlcnkgbG9uZyBsb29wIGluIHRoZSBwcmUtZGVjcmVtZW50IGxvZ2ljLgoqNDoJSW4gY2FzZSBvZiBhIGxpbmsgc3RhdHVzIGZyYW1lLCB0aGUgaW5mb3JtYXRpb24gaXMgY29waWVkIHRvIHRoZSBJRkIgZmllbGQgSUZCX2xpbmtTdGF0Cio2OglBbGwgb3RoZXIgdGhhbiBUYWxsaWVzIChpbmNsdWRpbmcgInVua25vd24iIG9uZXMpIGFyZSBjaGVja2VkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhlIE1TRgoqCXZpYSBDRkdfUklEX0xPRy4gSWYgYSBtYXRjaCBpcyBmb3VuZCBvciB0aGUgc2VsZWN0aW9uIHNldCBoYXMgdGhlIHdpbGQtY2FyZCB0eXBlIChpLmUgbm9uLU5VTEwgYnVmZmVyCioJcG9pbnRlciBhdCB0aGUgdGVybWluYXRpbmcgemVyby10eXBlKSwgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgKHR5cGUtc3BlY2lmaWMpIGxvZyBidWZmZXIuCioJTm90ZSB0aGF0IHRvIGFjY3VtdWxhdGUgdGFsbGllcyBpbnRvIElGQiBBTkQgdG8gbG9nIHRoZW0gb3IgdG8gbG9nIGEgZnJhbWUgd2hlbiBhIHNwZWNpZmljIG1hdGNoIG9jY3VyZXMKKglBTkQgYmFzZWQgb24gdGhlIHdpbGQtY2FyZCBzZWxlY3Rpb24sIHlvdSBoYXZlIHRvIGNhbGwgc2V0dXBfYmFwIGFnYWluIGFmdGVyIHRoZSAxc3QgY29weS4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCmlzcl9pbmZvKCBJRkJQIGlmYnAgKQp7CmhjZl8xNglpbmZvWzJdLCBmaWQ7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HClJJRF9MT0dQCXJpZHAgPSBpZmJwLT5JRkJfUklETG9ncDsJLy9OVUxMIG9yIHBvaW50ZXIgdG8gYXJyYXkgb2YgUklEX0xPRyBzdHJ1Y3R1cmVzICh0ZXJtaW5hdGVkIGJ5IHplcm8gdHlwKQojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoKCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gKTsJCQkJCQkJCQkJCQkJCQkJLyogMSAqLwoJZmlkID0gSVBXKCBIUkVHX0lORk9fRklEICk7CglEQVdBX1pFUk9fRklEKCBIUkVHX0lORk9fRklEICkKCWlmICggZmlkICkgewoJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAwLCBJT19JTiApOwoJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaW5mbywgNCBCRV9QQVIoMikgKTsKCQlIQ0ZBU1NFUlQoIGluZm9bMF0gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBpbmZvWzFdLCBpbmZvWzBdICkgKSAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQojaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX05JQwkJLy9IZXJtZXMgdGFsbHkgc3VwcG9ydAoJCWlmICggaW5mb1sxXSA9PSBDRkdfVEFMTElFUyApIHsKaGNmXzMyCSpwOwovKjIqLwkJaWYgKCBpbmZvWzBdID4gSENGX05JQ19UQUxfQ05UICkgewoJCQkJaW5mb1swXSA9IEhDRl9OSUNfVEFMX0NOVCArIDE7CgkJCX0KCQkJcCA9IChoY2ZfMzIqKSZpZmJwLT5JRkJfTklDX1RhbGxpZXM7CgkJCXdoaWxlICggaW5mb1swXS0tID4xICkgKnArKyArPSBJUFcoIEhSRUdfREFUQV8xICk7CS8vcmVxdWVzdCBtYXkgcmV0dXJuIHplcm8gbGVuZ3RoCgkJfQoJCWVsc2UKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQwoJCXsKLyo0Ki8JCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgewoJCQkJaWZicC0+SUZCX0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApOwoJCQl9CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCi8qNiovCQl3aGlsZSAoIDEgKSB7CgkJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgewoJCQkJCWlmICggcmlkcC0+YnVmcCApIHsKCQkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAJLy9zYXZlIEwKCQkJCQkJcmlkcC0+YnVmcFsxXSA9IGluZm9bMV07CQkJCQkJLy9zYXZlIFQKCQkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsyXSwgKHJpZHAtPmJ1ZnBbMF0gLSAxKSoyIEJFX1BBUigwKSApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJCXJpZHArKzsKCQkJfQojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoJCX0KCQlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPIHwgSENGX1RSQUNFX0VYSVQgKTsKCX0KCXJldHVybjsKfSAvLyBpc3JfaW5mbwojZW5kaWYgLy8gSENGX0RMX09OTFkKCi8vCi8vCi8vICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKLy8gLyo0Ki8JaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7Ci8vIAkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApIHwgQ0ZHX0xJTktfU1RBVF9DSEFOR0U7CS8vY29ycnVwdHMgQkFQICEhIDs/Ci8vIAkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKLy8gCQkJcHJpbnRrKCAiPDQ+bGlua3N0YXR1czogJTA0eFxuIiwgaWZicC0+SUZCX0RTTGlua1N0YXQgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwovLyAJCQlpZiAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7IAkvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgovLyAJCQkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOwkJCQkvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKLy8gCQkJCXByaW50ayggIjw1Pmlzcl9pbmZvOiBBd2FpdENvbm5lY3Rpb24gcGhhc2Ugc3RhcnRlZCwgSUZCX1RpY2tDbnQgPSAwXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vIAkJCX0KLy8gI2VuZGlmIC8vIEhDRl9ERFMKLy8gCQl9Ci8vICNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCi8vIC8qNiovCXdoaWxlICggMSApIHsKLy8gCQkJaWYgKCByaWRwLT50eXAgPT0gMCB8fCByaWRwLT50eXAgPT0gaW5mb1sxXSApIHsKLy8gCQkJCWlmICggcmlkcC0+YnVmcCApIHsKLy8gCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQovLyAJCQkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAyLCBJT19JTiApOwkJCS8vcmVzdG9yZSBCQVAgZm9yIHRhbGxpZXMsIGxpbmtzdGF0IGFuZCBzcGVjaWZpYyB0eXBlIGZvbGxvd2VkIGJ5IHdpbGQgY2FyZAovLyAJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oIHJpZHAtPmxlbiAtIDEsIGluZm9bMF0gKTsgCS8vc2F2ZSBMCi8vIAkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsxXSwgcmlkcC0+YnVmcFswXSoyIEJFX1BBUigwKSApOwovLyAJCQkJfQovLyAJCQkJYnJlYWs7IC8vOz90aGlzIGJyZWFrIGlzIG5vIGxvbmdlciBuZWVkZWQgZHVlIHRvIHNldHVwX2JhcCBidXQgbGV0cyBjb25jZW50cmF0ZSBvbiBERFMgZmlyc3QKLy8gCQkJfQovLyAJCQlyaWRwKys7Ci8vIAkJfQovLyAjZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwovLyAJfQovLyAJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7Ci8vCi8vCi8vCi8vCi8vCXJldHVybjsKLy99IC8vIGlzcl9pbmZvCi8vI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCiouUFVSUE9TRQkJZmlsdGVycyBhc3NlcnQgb24gbGV2ZWwgYW5kIGludGVyZmFjZXMgdG8gdGhlIE1TRiBzdXBwbGllZCBtc2ZfYXNzZXJ0IHJvdXRpbmUuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsaW5lX251bWJlcglsaW5lIG51bWJlciBvZiB0aGUgbGluZSB3aGljaCBjYXVzZWQgdGhlIGFzc2VydAoqCXEJCQlxdWFsaWZpZXIsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGdpdmUgYSBjbHVlIGFib3V0IHRoZSBwcm9ibGVtCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKiBtZGRfYXNzZXJ0IGhhcyBiZWVuIHRocm91Z2ggYSB0dXJtb2lsLCByZW5hbWluZyBoY2ZfYXNzZXJ0IHRvIGFzc2VydCBhbmQgaGNmX2Fzc2VydCBhZ2FpbiBhbmQgc3VwcG9ydGluZyBvZmYKKiBhbmQgb24gYmVpbmcgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCBhbmQgb3RoZXIgKCBpbW1hdHVyZSApIE1vZHVsYXJEcml2ZXJEZXZlbG9wbWVudCBtb2R1bGVzIGxpa2UgREhGIGFuZAoqIE1NRC4KICogISEhISBUaGUgYXNzZXJ0IHJvdXRpbmUgaXMgbm90IGFuIGhjZl8uLi4uLiByb3V0aW5lIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1heSBiZSBjYWxsZWQgYnkgdGhlIE1TRiwKICoJCWhvd2V2ZXIgaXQgaXMgY2FsbGVkIGZyb20gbW1kLmMgYW5kIGRoZi5jLCBzbyBpdCBtdXN0IGJlIGV4dGVybmFsLgogKgkJVG8gcHJldmVudCBuYW1lc3BhY2UgcG9sbHV0aW9uIGl0IG5lZWRzIGEgcHJlZml4LCB0byBwcmV2ZW50IHRoYXQgTVNGIHByb2dyYW1tZXJzIHRoaW5rIHRoYXQKICoJCXRoZXkgYXJlIGFsbG93ZWQgdG8gY2FsbCB0aGUgYXNzZXJ0IGxvZ2ljLCB0aGUgcHJlZml4IEhDRiBjYW4ndCBiZSB1c2VkLCBzbyBNREQgaXMgc2VsZWN0ZWQhISEhCiAqCiogV2hlbiBjYWxsZWQgZnJvbSB0aGUgREhGIG1vZHVsZSB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYnkgREhGX0ZJTEVfTkFNRV9PRkZTRVQgYW5kIHdoZW4gY2FsbGVkIGZyb20KKiB0aGUgTU1EIG1vZHVsZSBieSBNTURfRklMRV9OQU1FX09GRlNFVC4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIEhDRl9BU1NFUlQKdm9pZAptZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQp7CmhjZl8xNglydW5fdGltZV9mbGFnID0gaWZicC0+SUZCX0Fzc2VydEx2bDsKCglpZiAoIHJ1bl90aW1lX2ZsYWcgLyogPiA7Pz8/Pz8/ICovICkgeyAvL3ByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yLCBsYXRlciB0byBiZSBleHRlbmRlZCB0byBsZXZlbCBmaWx0ZXJpbmcKCQlpZmJwLT5JRkJfQXNzZXJ0UXVhbGlmaWVyID0gcTsKCQlpZmJwLT5JRkJfQXNzZXJ0TGluZSA9IChoY2ZfMTYpbGluZV9udW1iZXI7CiNpZiAoSENGX0FTU0VSVCkgJiAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gKQoJCWlmICggaWZicC0+SUZCX0Fzc2VydFJ0biApIHsKCQkJaWZicC0+SUZCX0Fzc2VydFJ0biggbGluZV9udW1iZXIsIGlmYnAtPklGQl9Bc3NlcnRUcmFjZSwgcSApOwoJCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfU1dfU1VQCgkJT1BXKCBIUkVHX1NXXzIsIGxpbmVfbnVtYmVyICk7CgkJT1BXKCBIUkVHX1NXXzIsIGlmYnAtPklGQl9Bc3NlcnRUcmFjZSApOwoJCU9QVyggSFJFR19TV18yLCAoaGNmXzE2KXEgKTsKCQlPUFcoIEhSRUdfU1dfMiwgKGhjZl8xNikocSA+PiAxNiApICk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1NXX1NVUAoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgJiYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgoJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAwOwkJCQkJCQkJCS8vIHByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yCgkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0Fzc2VydFN0cmN0ICk7CgkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IHJ1bl90aW1lX2ZsYWc7CQkJCQkJLy8gcmVzdG9yZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGV2ZWwKI2VuZGlmIC8vIEhDRl9FWFRfTUIgLyBIQ0ZfQVNTRVJUX01CCgl9Cn0gLy8gbWRkX2Fzc2VydAojZW5kaWYgLy8gSENGX0FTU0VSVAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQoqLlBVUlBPU0UJCXdyaXRlcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIEhvc3QgbWVtb3J5IHRvIE5JQyBSQU0uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioJd29yZF9sZW4JQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSBub3QgeWV0IHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHB1dF9mcmFnIGFuZCBjb3B5IGxlbgoqIChvciBsZW4tMSkgYnl0ZXMgZnJvbSBidWZwIHRvIE5JQy4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCioJSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKglBc3NlcnQgb24gbGVuIGlzIHBvc3NpYmxlCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQp7CmhjZl9pbwkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0RBVEFfMTsJLy9CQVAgZGF0YSByZWdpc3RlcgppbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCmhjZl8xNgkJajsKCUhDRkFTU0VSVCggKChoY2ZfMzIpYnVmcCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQojaWYgSENGX0JJR19FTkRJQU4KCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICkKCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0VfMiggd29yZF9sZW4sIGxlbiApICkKCglpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJCS8vaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydAogCQkJCQkJCQkJCQkJCQkvLy4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAxc3QgaGNmXzE2CgkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OwoJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQkJCQkJCQkJCQkJCQkvLy4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CgkJbGVuIC09IDI7CgkJYnVmcCArPSAyOwoJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCQkvLy4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKIAkJCQkJCQkJCQkJCQkJLy8uICAuICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMm5kIGhjZl8xNgoJCQlqID0gYnVmcFsxXSB8IGJ1ZnBbMF08PDg7CS8qYnVmcCBpcyBhbHJlYWR5IGluY3JlbWVudGVkIGJ5IDIqLwoJCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJCQkJCQkJCQkJCQkJLy8uICAuICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQoJCQlsZW4gLT0gMjsKCQkJYnVmcCArPSAyOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCglpID0gbGVuOwoJaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeU91dCApIHsJCQkJCS8vc2tpcCB6ZXJvLWxlbmd0aAoJCWogPSAoKCpidWZwKTw8OCkgKyAoIGlmYnAtPklGQl9DYXJyeU91dCAmIDB4RkYgKTsKCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJYnVmcCsrOyBpLS07CgkJaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKCX0KI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUwoJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCgkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAoJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFXzE2QklUKSAmJiBpID49IDYgKSB7CmhjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KCQlpZiAoICggKGhjZl8zMilidWZwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKCQkJaWYgKCAoaGNmXzMyKWJ1ZnAgJiAweDIgKSB7CQkJCS8vLiAgLiAgaWYgYnVmZmVyIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLy8uICAuICAuICB3cml0ZSBhIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQlqID0gKih3Y2lfcmVjb3JkcClidWZwOwkJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CgkJCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCQlidWZwICs9IDI7IGkgLT0gMjsKCQkJfQoJCQkJCQkJCQkJCQkJLy8uICAuICB3cml0ZSBhcyBtYW55IGRvdWJsZSB3b3JkIGFzIHBvc3NpYmxlCgkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOwoJCQlqID0gKGhjZl8xNilpLzQ7CgkJCU9VVF9QT1JUX1NUUklOR18zMiggaW9fcG9ydCwgcDQsIGogKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJYnVmcCArPSBpICYgfjB4MDAwMzsKCQkJaSAmPSAweDAwMDM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0lPXzMyQklUUwoJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMSB3b3JkIGxlZnQKCWlmICggaSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgaWYgb2RkIG51bWJlciBvZiBieXRlcyBsZWZ0CgkJaWYgKCBpICYgMHgwMDAxICkgewoJCQkJCQkJCQkJCQkJLy8uICAuICBzYXZlIGxlZnQgb3ZlciBieXRlIChiZWZvcmUgYnVmcCBpcyBjb3JydXB0ZWQpIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwoJCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAoaGNmXzE2KWJ1ZnBbaS0xXSB8IDB4MDEwMDsJLy9ub3RlIHRoYXQgaSBhbmQgYnVmcCBhcmUgYWx3YXlzIHNpbXVsdGFuZW91c2x5IG1vZGlmaWVkLCAmYnVmcFtpLTFdIGlzIGludmFyaWFudAoJCX0KCQkJCQkJCQkJCQkJCS8vLiAgd3JpdGUgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CgkJaiA9IChoY2ZfMTYpaS8yOwoJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7Cgl9Cn0gLy8gcHV0X2ZyYWcKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCiouUFVSUE9TRQkJY2xlYW51cCBhZnRlciBwdXRfZnJhZyBmb3IgdHJhaWxpbmcgb2RkIGJ5dGUgYW5kIE1JQyB0cmFuc2ZlciB0byBOSUMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogZmluYWxpemUgdGhlIE1JQyBjYWxjdWxhdGlvbiB3aXRoIHRoZSBwYWRkaW5nIHBhdHRlcm4sIG91dHB1dCB0aGUgbGFzdCBieXRlIChpZiBhcHBsaWNhYmxlKQoqIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgTUlDIHRvIHRoZSBUeEZTCioKKgoqLkRJQUdSQU0KKjI6CTEgYnl0ZSBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX0NhcnJ5T3V0ICggdGhlIHB1dF9mcmFnIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgoqCTEgLSAzIGJ5dGVzIG9mIHRoZSBsYXN0IHB1dF9mcmFnIG1heSBiZSBzdGlsbCBpbiBJRkJfdHhfMzIgKCB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KKglUaGUgY2FsbCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIHJvdXRpbmUgZmVlZHMgdGhlc2UgcmVtYWluaW5nIGJ5dGVzIChpZiBhbnkpIG9mIHB1dF9mcmFnIGFuZCB0aGUKKglqdXN0IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHBhZGRpbmcgYXMgbmVlZGVkIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lLiBOb3RlIHRoYXQgdGhlICJ1bm5lZWRlZCIgcGFkCioJYnl0ZXMgc2ltcGx5IGVuZCB1cCBpbiB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgYW5kIGFyZSBuZXZlciB1c2VkLgoqODoJd3JpdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgTUlDIGFuZCBwb3NzaWJsZSBzb21lIGdhcmJhZ2UgdG8gTklDIFJBTQoqCU5vdGU6IGkgaXMgYWx3YXlzIDQgKGEgbG9vcC1pbnZhcmlhbnQgb2YgdGhlIHdoaWxlIGluIHBvaW50IDIpCioKKi5OT1RJQ0UKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQp7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCglpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ICE9IDB4RkZGRikgewkJLy9pZiBNSUMgY2FsY3VsYXRpb24gYWN0aXZlCgkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOwkJCQkvLy4gIGZlZWQgKHVwIHRvIDggYnl0ZXMgb2YpIHZpcnR1YWwgcGFkZGluZyB0byBNSUMgZW5naW5lCgkJCQkJCQkJCQkJCS8vLiAgd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBieXRlICsgKG1vc3Qgb2YpIE1JQwoJCXB1dF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaWZicC0+SUZCX01JQ1R4LCA4IEJFX1BBUigwKSApOwoJfQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCglwdXRfZnJhZyggaWZicCwgbnVsbF9hZGRyLCAxIEJFX1BBUigwKSApOwkvL3dyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgZGF0YSBvciBNSUMgYnl0ZQp9IC8vIHB1dF9mcmFnX2ZpbmFsaXplCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKi5QVVJQT1NFCQlzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJYWRkcmVzcyBpbiBOSUMgUkFNIHdoZXJlIExWVC1yZWNvcmRzIGFyZSBsb2NhdGVkCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKgk+PnB1dF9mcmFnCioJPj5jbWRfd2FpdAoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKKjI0OiBJZiB0aGUgUklEIGRvZXMgbm90IGV4aXN0LCB0aGUgTC1maWVsZCBpcyBzZXQgdG8gemVyby4KKglOb3RlIHRoYXQgc29tZSBSSURzIGNhbiBub3QgYmUgcmVhZCwgZS5nLiB0aGUgcHNldWRvIFJJRHMgZm9yIGRpcmVjdCBIZXJtZXMgY29tbWFuZHMgYW5kIENGR19ERUZBVUxUX0tFWVMKKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCioKKi5OT1RJQ0UKKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfUkVHX01CKSBhcmUgZXhwbGljaXRseSBoYW5kbGVkIGJ5IHRoZSBIQ0Ygd2hpY2ggaW1wbGllcyB0aGF0IHRoZXNlIGNvZGVzCioJCWFyZSB2YWxpZC4gVGhlc2UgY29kZXMgYXJlIGFscmVhZHkgY29uc3VtZWQgYnkgaGNmX3B1dF9pbmZvLgoqCSAgLSBhbGwgb3RoZXIgY29kZXMgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiBCZWZvcmUgdGhlIHB1dCBhY3Rpb24gaXMgZXhlY3V0ZWQsIGhjZl9nZXRfaW5mbyBpcyBjYWxsZWQKKgkJd2l0aCBhbiBMVFYgcmVjb3JkIHdpdGggYSB2YWx1ZSBvZiAxIGluCXRoZSBMLWZpZWxkIGFuZCB0aGUgaW50ZW5kZWQgcHV0IGFjdGlvbiB0eXBlIGluIHRoZSBUeXAtY29kZQoqCQlmaWVsZC4gSWYgdGhlIHB1dCBhY3Rpb24gdHlwZSBpcyB2YWxpZCwgaXQgaXMgYWxzbyB2YWxpZCBhcyBhIGdldCBhY3Rpb24gdHlwZSBjb2RlIC0gZXhjZXB0CioJCWZvciBDRkdfREVGQVVMVF9LRVlTIGFuZCBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgLSBzbyB0aGUgSENGX0FTU0VSVCBsb2dpYyBvZiBoY2ZfZ2V0X2luZm8gc2hvdWxkCioJCW5vdCBjYXRjaC4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwCSkKewoKaW50IHJjID0gSENGX1NVQ0NFU1M7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCwgTUVSR0VfMiggbHR2cC0+dHlwLCBpZmJwLT5JRkJfQ2FyZFN0YXQgKSApCglIQ0ZBU1NFUlQoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCwgbHR2cC0+dHlwICkKCglpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmCQkJCQkJCQkJCQkJCQkJCS8qIDIwKi8KCQkgKCAoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgICAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCApIHx8CgkJICAgKCBDRkdfUklEX0VOR19NSU4gPD0gbHR2cC0+dHlwIC8qICYmIGx0dnAtPnR5cCA8PSAweEZGRkYgKi8gICAgICAgKSAgICAgKSApIHsKI2lmIEhDRl9BU1NFUlQgLy9GQ0M4LCBGQ0IwLCBGQ0I0LCBGQ0I2LCBGQ0I3LCBGQ0I4LCBGQ0MwLCBGQ0M0LCBGQ0JDLCBGQ0JELCBGQ0JFLCBGQ0JGCiB7CiBoY2ZfMTYJCXQgPSBsdHZwLT50eXA7CiBMVFZfU1RSQ1QgCXggPSB7IDIsIHQsIHswfSB9OwkJCQkJCQkJCQkJCQkJCS8qMjQqLwoJaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmeCApOwoJaWYgKCB4LmxlbiA9PSAwICYmCgkJICggdCAhPSBDRkdfREVGQVVMVF9LRVlTICYmIHQgIT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZICYmCgkJICAgdCAhPSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZICYmCgkJICAgdCAhPSBDRkdfSEFORE9WRVJfQUREUiAmJiB0ICE9IENGR19ESVNBU1NPQ0lBVEVfQUREUiAmJgoJCSAgIHQgIT0gQ0ZHX0ZDQkMgJiYgdCAhPSBDRkdfRkNCRCAmJiB0ICE9IENGR19GQ0JFICYmIHQgIT0gQ0ZHX0ZDQkYgJiYKCQkgICB0ICE9IENGR19ERUFVVEhFTlRJQ0FURV9BRERSCgkJICkKCQkpIHsKCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+dHlwICkKCQl9CiB9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJCXJjID0gc2V0dXBfYmFwKCBpZmJwLCBsdHZwLT50eXAsIDAsIElPX09VVCApOwoJCXB1dF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApbHR2cCwgMipsdHZwLT5sZW4gKyAyIEJFX1BBUigyKSApOwovKjI4Ki8JaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUyArIEhDTURfQUNDRVNTX1dSSVRFLCBsdHZwLT50eXAgKTsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0gLy8gcHV0X2luZm8KCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IHB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQoqLlBVUlBPU0UJIAlhY2N1bXVsYXRlcyBhICggc2VyaWVzIG9mKSBidWZmZXJzIGludG8gYSBzaW5nbGUgSW5mbyBibG9jayBpbnRvIHRoZSBNYWlsQm94LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgInR5cGUiIGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBzeW50aGVzaXplZAoqCQkJCWFzIGFuIExUViBpbnRvIHRoZSBNYWlsQm94CioKKi5SRVRVUk5TCioKKi5ERVNDUklQVElPTgoqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgoqIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZC4KKiBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoLgoqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgoqCiogTm90ZSB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCAxIHdvcmQgb2YgdW51c2VkIHNwYWNlIGluIHRoZSBtYWlsIGJveC4KKiBBcyBhIGNvbnNlcXVlbmNlOgoqIC0gbm8gcHJvYmxlbSBpbiBwb2ludGVyIGFyaXRobWV0aWMgKE1CX1JQID09IE1CX1dQIG1lYW5zIHVuYW1iaWd1b3VzbHkgbWFpbCBib3ggaXMgY29tcGxldGVseSBlbXB0eQoqIC0gVGhlcmUgaXMgYWx3YXlzIGZyZWUgc3BhY2UgdG8gd3JpdGUgYW4gTCBmaWVsZCB3aXRoIGEgdmFsdWUgb2YgemVybyBhZnRlciBlYWNoIE1CX0luZm8gYmxvY2suICBUaGlzCiogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCioKKgoqLkRJQUdSQU0KKjE6CUNhbGN1bGF0ZSBMIGZpZWxkIG9mIHRoZSBNQklCLCBpLmUuIDEgZm9yIHRoZSBULWZpZWxkICsgdGhlIGN1bXVsYXRpdmUgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudHMuCioyOglUaGUgZnJlZSBzcGFjZSBpbiB0aGUgTWFpbEJveCBpcyBjYWxjdWxhdGVkICgyYTogZnJlZSBwYXJ0IGZyb20gV3JpdGUgUHRyIHRvIFJlYWQgUHRyLCAyYjogZnJlZSBwYXJ0CioJdHVybnMgb3V0IHRvIHdyYXAgYXJvdW5kKSAuIElmIHRoaXMgc3BhY2Ugc3VmZmljZXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3b3JkcyByZWZsZWN0ZWQgYnkgbGVuIChULWZpZWxkCioJKyBWYWx1ZS1maWVsZCkgcGx1cyB0aGUgYWRkaXRpb25hbCBNYWlsQm94IEluZm8gTC1maWVsZCArIGEgdHJhaWxpbmcgMCB0byBhY3QgYXMgdGhlIEwtZmllbGQgb2YgYSB0cmFpbGluZwoqCWR1bW15IG9yIGVtcHR5IExUViByZWNvcmQsIHRoZW4gYSBNYWlsQm94IEluZm8gYmxvY2sgaXMgYnVpbGQgaW4gdGhlIE1haWxCb3ggY29uc2lzdGluZyBvZgoqCSAgLSB0aGUgdmFsdWUgbGVuIGluIHRoZSBmaXJzdCB3b3JkCioJICAtIHR5cGUgaW4gdGhlIHNlY29uZCB3b3JkCioJICAtIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgc2Vjb25kIGFuZCBoaWdoZXIgd29yZAoqCio0OglTaW5jZSBwdXRfaW5mb19tYigpIGNhbiBtb3JlIG9yIGxlc3MgZGlyZWN0bHkgYmUgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCwgdGhlIEkvRiBtdXN0IGJlIHJvYnVzdAoqCWFnYWluc3Qgb3V0LW9mLXJhbmdlIHZhcmlhYmxlcy4gQXMgZmFpbHNhZmUgY29kaW5nLCB0aGUgTUIgdXBkYXRlIGlzIHNraXBwZWQgYnkgY2hhbmdpbmcgdGxlbiB0byAwIGlmCioJbGVuID09IDA7IFRoaXMgd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGFuIGFzc2VydCBhcyByZXN1bHQgb2YgdGhlIHZpb2xhdGlvbiBvZiB0aGUgbmV4dCBpZiBjbGF1c2UuCio2OglDaGVjayB3aGV0aGVyIHRoZSBmcmVlIHNwYWNlIGluIE1haWxCb3ggc3VmZmljZXMgKHRoaXMgY292ZXJzIHRoZSBjb21wbGV0ZSBhYnNlbmNlIG9mIHRoZSBNYWlsQm94KS4KKglOb3RlIHRoYXQgbGVuIGlzIHVuc2lnbmVkLCBzbyBldmVuIE1TRiBJL0YgdmlvbGF0aW9uIHdvcmtzIG91dCBPLksuCioJVGhlICcyJyBpbiB0aGUgZXhwcmVzc2lvbiAibGVuKzIiIGlzIHVzZWQgYmVjYXVzZSAxIHdvcmQgaXMgbmVlZGVkIGZvciBMIGl0c2VsZiBhbmQgMSB3b3JkIGlzIG5lZWRlZAoqCWZvciB0aGUgemVyby1zZW50aW5lbAoqODoJdXBkYXRlIE1haWxCb3ggSW5mbyBsZW5ndGggcmVwb3J0IHRvIE1TRiB3aXRoICJvbGRlc3QiIE1CIEluZm8gQmxvY2sgc2l6ZS4gQmUgY2FyZWZ1bCBoZXJlLCBpZiB5b3UgZ2V0CioJaGVyZSBiZWZvcmUgdGhlIE1haWxCb3ggaXMgcmVnaXN0ZXJlZCwgeW91IGNhbid0IHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFkZHJlc3NlZCBieSBJRkJfTUJwIChpdCBpcyB0aGUKKglOdWxsIGJ1ZmZlcikgc28gZG9uJ3QgbW92ZSB0aGlzIGNvZGUgdGlsbCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSBidXQga2VlcCBpdCB3aGVyZSB0aGVyZSBpcyBnYXJ1YW50ZWVkCioJYSBidWZmZXIuCioKKi5OT1RJQ0UKKglib3VuZGFyeSB0ZXN0aW5nIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBJRkJfTUJTaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBubyBNYWlsQm94IGlzIHByZXNlbnQsCioJYW5kIHRvIGEgbGVzc2VyIGRlZ3JlZSwgdGhhdCBJRkJfTUJXcCA9IElGQl9NQlJwID0gMAoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoKSENGX1NUQVRJQyBpbnQKcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJaTsJCQkJCQkvL3dvcmsgY291bnRlcgpoY2ZfMTYJCSpkcDsJCQkJCS8vZGVzdGluYXRpb24gcG9pbnRlciAoaW4gTWFpbEJveCkKd2NpX3JlY29yZHAJc3A7CQkJCQkJLy9zb3VyY2UgcG9pbnRlcgpoY2ZfMTYJCWxlbjsJCQkJCS8vdG90YWwgbGVuZ3RoIHRvIGNvcHkgdG8gTWFpbEJveApoY2ZfMTYJCXRsZW47CQkJCQkvL2ZyZWUgbGVuZ3RoL3dvcmtpbmcgbGVuZ3RoL29mZnNldCBpbiBXTVAgZnJhbWUKCglpZiAoIGlmYnAtPklGQl9NQnAgPT0gTlVMTCApIHJldHVybiByYzsgIC8vOz9ub3Qgc3VmZmljaWVudAoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJwICE9IE5VTEwsIDAgKQkJCQkJLy8hISFiZSBjYXJlZnVsLCBkb24ndCBnZXQgaW50byBhbiBlbmRsZXNzIHJlY3Vyc2lvbgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplLCAwICkKCglsZW4gPSAxOwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMSAqLwoJZm9yICggaSA9IDA7IGkgPCBsdHZwLT5mcmFnX2NudDsgaSsrICkgewoJCWxlbiArPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2xlbjsKCX0KCWlmICggaWZicC0+SUZCX01CUnAgPiBpZmJwLT5JRkJfTUJXcCApIHsKCQl0bGVuID0gaWZicC0+SUZCX01CUnAgLSBpZmJwLT5JRkJfTUJXcDsJCQkJCQkJCQkJCQkJCQkvKiAyYSovCgl9IGVsc2UgewoJCWlmICggaWZicC0+SUZCX01CUnAgPT0gaWZicC0+SUZCX01CV3AgKSB7CgkJCWlmYnAtPklGQl9NQlJwID0gaWZicC0+SUZCX01CV3AgPSAwOwkvLyBvcHRpbWl6ZSBXcmFwcGluZwoJCX0KCQl0bGVuID0gaWZicC0+SUZCX01CU2l6ZSAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJLyogMmIqLwoJCWlmICggKCB0bGVuIDw9IGxlbiArIDIgKSAmJiAoIGxlbiArIDIgPCBpZmJwLT5JRkJfTUJScCApICkgewkvL2lmIHRyYWlsaW5nIHNwYWNlIGlzIHRvbyBzbWFsbCBidXQKCQkJCQkJCQkJCQkJCQkJCQkvLwkgbGVhZGluZyBzcGFjZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UKCQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAweEZGRkY7CQkJCQkvL2ZsYWcgZHVtbXkgTFRWIHRvIGZpbGwgdGhlIHRyYWlsaW5nIHNwYWNlCgkJCWlmYnAtPklGQl9NQldwID0gMDsJCQkJCQkJCQkJLy9yZXNldCBXcml0ZVBvaW50ZXIgdG8gYmVnaW4gb2YgTWFpbEJveAoJCQl0bGVuID0gaWZicC0+SUZCX01CUnA7CQkJCQkJCQkJLy9nZXQgbmV3IGF2YWlsYWJsZSBzcGFjZSBzaXplCgkJfQoJfQoJZHAgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF07CglpZiAoIGxlbiA9PSAwICkgewoJCXRsZW4gPSAwOyAvLzs/IHdoYXQgaXMgdGhpcyBnb29kIGZvcgoJfQoJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KCQkvL0RvIE5vdCBBU1NFUlQsIHRoaXMgaXMgYSBub3JtYWwgY29uZGl0aW9uCgkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5Ob0J1Zk1CKys7ICkgLypOT1AgdG8gY292ZXIgYWdhaW5zdCBhbmFsb21pZXMgd2l0aCBlbXB0eSBjb21wb3VuZCovOwoJCXJjID0gSENGX0VSUl9MRU47Cgl9IGVsc2UgewoJCSpkcCsrID0gbGVuOwkJCQkJCQkJCS8vd3JpdGUgTGVuICg9IHNpemUgb2YgVCtWIGluIHdvcmRzIHRvIE1CX0luZm8gYmxvY2sKCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOwkJCQkJCQkvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jawoJCWlmYnAtPklGQl9NQldwICs9IGxlbiArIDE7CQkJCQkJLy91cGRhdGUgV3JpdGVQb2ludGVyIG9mIE1haWxCb3gKCQlmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7CQkJCS8vIHByb2Nlc3MgZWFjaCBvZiB0aGUgZnJhZ21lbnRzCgkJCXNwID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19hZGRyOwoJCQlsZW4gPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2xlbjsKCQkJd2hpbGUgKCBsZW4tLSApICpkcCsrID0gKnNwKys7CgkJfQoJCWlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CV3BdID0gMDsJCQkJLy90byBhc3N1cmUgZ2V0X2luZm8gZm9yIENGR19NQl9JTkZPIHN0b3BzCgkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwkJCQkJCQkJCQkJLyogOCAqLwoJfQoJcmV0dXJuIHJjOwp9IC8vIHB1dF9pbmZvX21iCgojZW5kaWYgLy8gSENGX0VYVF9NQgojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQoqLlBVUlBPU0UJCXNldCB1cCBkYXRhIGFjY2VzcyB0byBOSUMgUkFNIHZpYSBCQVBfMS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCQlhZGRyZXNzIG9mIEkvRiBCbG9jawoqCWZpZAkJCQlGSUQvUklECioJb2Zmc2V0CQkJISFldmVuISEgb2Zmc2V0IGluIEZJRC9SSUQKKgl0eXBlCQkJSU9fSU4sIElPX09VVAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCQkJCQlPLksKKglIQ0ZfRVJSX05PX05JQwkJCQljYXJkIGlzIHJlbW92ZWQKKglIQ0ZfRVJSX0RFRlVOQ1RfVElNRV9PVVQJRmF0YWwgbWFsZnVuY3Rpb24gZGV0ZWN0ZWQKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uLi4JCWlmIGFuZCBvbmx5IGlmIElGQl9EZWZ1bmN0U3RhdCA8PiAwCioKKi5ERVNDUklQVElPTgoqCiogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKKiAtIHRoZSBOSUMgaXMgY29uc2lkZXJlZCBub25vcGVyYXRpb25hbCwgZS5nLiBkdWUgdG8gYSB0aW1lLW91dCBvZiBzb21lIEhlcm1lcyBhY3Rpdml0eSBpbiB0aGUgcGFzdAoqIC0gQkFQXzEgY291bGQgbm90IHByb3Blcmx5IGJlIGluaXRpYWxpemVkCiogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCiogSW4gYWxsIG90aGVyIGNhc2VzLCBhIHplcm8gaXMgcmV0dXJuZWQuCiogQkFQIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaW5kaWNhdGVzIGFuIEgvVyBlcnJvciB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0byBzaWduYWwgY29tcGxldGUgSC9XIGZhaWx1cmUuCiogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKKiAiZGVmdW5jdCIgc3RhdHVzIHRpbGwgdGhlIEhlcm1lcyBpcyByZS1pbml0aWFsaXplZCBieSBtZWFucyBvZiBhbiBoY2ZfY29ubmVjdC4KKgoqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKKiBSSUQuIFRoaXMgYWNjZXNzIGlzIGJhc2VkIG9uIGEgYXV0by1pbmNyZW1lbnQgZmVhdHVyZS4KKiBUaGVyZSBhcmUgdHdvIEJBUHMgYnV0IHRoZXNlIGRheXMgdGhlIEhDRiB1c2VzIG9ubHkgQkFQXzEgYW5kIGxlYXZlcyBCQVBfMCB0byB0aGUgUENJIEJ1c21hc3RlcmluZyBIL1cuCioKKiBUaGUgQkFQLW1lY2hhbmlzbSBpcyBiYXNlZCBvbiB0aGUgQnVzeSBiaXQgaW4gdGhlIE9mZnNldCByZWdpc3RlciAoc2VlIHRoZSBIZXJtZXMgZGVmaW5pdGlvbikuIFRoZSB3YWl0aW5nCiogZm9yIEJ1c3kgbXVzdCBvY2N1ciBiZXR3ZWVuIHdyaXRpbmcgdGhlIE9mZnNldCByZWdpc3RlciBhbmQgYWNjZXNzaW5nIHRoZSBEYXRhIHJlZ2lzdGVyLiBUaGUKKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKKiByZXF1aXJlbWVudCB0aGF0IHRoZSBCdXN5IGJpdCBpcyBsb3cgIGJlZm9yZSB0aGUgU2VsZWN0IHJlZ2lzdGVyIGlzIHdyaXR0ZW4sIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgoqIEJBUC1zZXR1cCBtYXkgYmUgdGltZSBjb25zdW1pbmcgKGUuZy4gMzgwIHVzZWMgZm9yIGxhcmdlIG9mZnNldHMgb2NjdXJzIGZyZXF1ZW50bHkpLiBUaGUgd2FpdCBmb3IgQnVzeSBiaXQKKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgoqCiogVGhlIE5JQyBJL0YgaXMgb3B0aW1pemVkIGZvciB3b3JkIHRyYW5zZmVyIGFuZCBjYW4gb25seSBoYW5kbGUgd29yZCB0cmFuc2ZlciBhdCBhIHdvcmQgYm91bmRhcnkgaW4gTklDCiogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAoqIFMvVyBXb3JrYXJvdW5kIHN0cmF0ZWdpZXMuIFJJRCBhY2Nlc3MgaXMgaGNmXzE2IGJhc2VkIGJ5ICJuYXR1cmUiLCBzbyBubyBieXRlIGFjY2VzcyBwcm9ibGVtcy4gIEZvciBUeC9SeAoqIEZJRCBhY2Nlc3MsICB0aGUgYnl0ZSBsb2dpYyBiZWNhbWUgb2Jzb2xldGUgYnkgYWJzb3JiaW5nIGl0IGluIHRoZSBkb3VibGUgd29yZCBvcmllbnRlZCBuYXR1cmUgb2YgdGhlIE1JQwoqIGZlYXR1cmUuCioKKgoqLkRJQUdSQU0KKgoqMjoJdGhlIHRlc3Qgb24gcmMgY2hlY2tzIHdoZXRoZXIgdGhlIEhDRiB3ZW50IGludG8gImRlZnVuY3QiIG1vZGUgKCBlLmcuIEJBUCBpbml0aWFsaXphdGlvbiBvciBhIGNhbGwgdG8KKgljbWRfd2FpdCBkaWQgZXZlciBmYWlsKS4KKjQ6CXRoZSBzZWxlY3QgcmVnaXN0ZXIgYW5kIG9mZnNldCByZWdpc3RlciBhcmUgc2V0CioJdGhlIG9mZnNldCByZWdpc3RlciBpcyBtb25pdG9yZWQgdGlsbCBhIHN1Y2Nlc3NmdWwgY29uZGl0aW9uIChubyBidXN5IGJpdCkgaXMgZGV0ZWN0ZWQgb3IgdGlsbCB0aGUKKgkoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKKglJZiB0aGUgY291bnRlciBleHBpcmVzLCB0aGlzIGlzIHJlZmxlY3RlZCBpbiBJRkJfRGVmdW5jdFN0YXQsIHNvIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHNldHVwX2JhcCBmYWlsCioJaW1tZWRpYXRlbHkgKCBzZWUgMikKKjY6CWluaXRpYWxpemF0aW9uIG9mIHRoZSBjYXJyeSBhcyB1c2VkIGJ5IHBldC9nZXRfZnJhZwoqODoJSFJFR19PRkZTRVRfRVJSIGlzIGlnbm9yZWQgYXMgZXJyb3IgYmVjYXVzZToKKgkgYTogdGhlIEhlcm1lcyBpcyByb2J1c3QgYWdhaW5zdCBpdAoqCSBiOiBpdCBpcyBub3Qga25vd24gd2hhdCBjYXVzZXMgaXQgKHByb2JhYmx5IGEgYnVnKSwgaGVuY2Ugbm8gc3RyYXRlZ3kgY2FuIGJlIHNwZWNpZmllZCB3aGljaCBsZXZlbCBpcwoqCQl0byBoYW5kbGUgdGhpcyBlcnJvciBpbiB3aGljaCB3YXkuIEluIHRoZSBwYXN0LCBpdCBjb3VsZCBiZSBpbmR1Y2VkIGJ5IHRoZSBNU0YgbGV2ZWwsIGUuZy4gYnkgY2FsbGluZwoqCQloY2ZfcmN2X21zZyB3aGlsZSB0aGVyZSB3YXMgbm8gUngtRklEIGF2YWlsYWJsZS4gU2luY2UgdGhpcyBpcyBhbiBNU0YtZXJyb3Igd2hpY2ggaXMgY2F1Z2h0IGJ5IEFTU0VSVCwKKgkJdGhlcmUgaXMgbm8gcnVuLXRpbWUgYWN0aW9uIHJlcXVpcmVkIGJ5IHRoZSBIQ0YuCioJTHVtcGluZyB0aGUgT2Zmc2V0IGVycm9yIGluIHdpdGggdGhlIEJ1c3kgYml0IGVycm9yLCBhcyBoYXMgYmVlbiBkb25lIGluIHRoZSBwYXN0IHR1cm5zIG91dCB0byBiZSBhCioJZGlzYXN0ZXIgb3IgYSBsaWZlIHNhdmVyLCBqdXN0IGRlcGVuZGluZyBvbiB3aGF0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMuIFNpbmNlIG5vIHByZWRpY3Rpb24gY2FuIGJlCioJZG9uZSBhYm91dCB0aGUgZnV0dXJlLCBpdCBpcyAiZmVsdCIgdG8gYmUgdGhlIGJlc3Qgc3RyYXRlZ3kgdG8gaWdub3JlIHRoaXMgZXJyb3IuIE9uZSBkYXkgdGhlIGNvZGUgd2FzCioJYWNjb21wYW5pZWQgYnkgdGhlIGZvbGxvd2luZyBjb21tZW50OgoqCS8vCWlnbm9yZSBIUkVHX09GRlNFVF9FUlIsIHNvbWVvbmUsIHN1cHBvc2VkbHkgdGhlIE1TRiBwcm9ncmFtbWVyIDspIG1hZGUgYSBidWcuIFNpbmNlIHdlIGRvbid0IGtub3cKKgkvLwl3aGF0IGlzIGdvaW5nIG9uLCB3ZSBtaWdodCBhcyB3ZWxsIGdvIG9uIC0gdW5kZXIgbWFuYWdlbWVudCBwcmVzc3VyZSAtIGJ5IGlnbm9yaW5nIGl0CioKKi5FTkRET0MgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQp7ClBST1RfQ05UX0lOSQppbnQJcmM7CgoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyApOwoJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQ7CglpZiAocmMgPT0gSENGX1NVQ0NFU1MpIHsJCQkJCQkJCQkJLyoyKi8KCQlPUFcoIEhSRUdfU0VMRUNUXzEsIGZpZCApOwkJCQkJCQkJCQkJCQkJCQkvKjQqLwoJCU9QVyggSFJFR19PRkZTRVRfMSwgb2Zmc2V0ICk7CgkJaWYgKCB0eXBlID09IElPX0lOICkgewoJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7CgkJfQoJCWVsc2UgaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKCQlIQ0ZfV0FJVF9XSElMRSggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhDTURfQlVTWSApOwoJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICkJCQkvKjgqLwoJCWlmICggcHJvdF9jbnQgPT0gMCApIHsKCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQoJCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDsKCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwoJCX0KCX0KCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfU1RSSU8gfCBIQ0ZfVFJBQ0VfRVhJVCApOwoJcmV0dXJuIHJjOwp9IC8vIHNldHVwX2JhcAoK