Ly8gICB2aW06dHc9MTEwOnRzPTQ6Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZJTEUgICA6CUhDRi5DCioKKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCiogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWw6CTIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKiBPcmlnaW5hbDoJMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCiogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQoqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKiBPcmlnaW5hbDoJMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCiogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQoqCiogQVVUSE9SIDoJTmljbyBWYWxzdGVyCioKKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgoqCiogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCioJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcwoqCioJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCiogU09GVFdBUkUgTElDRU5TRQoqCiogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwoqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCioKKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCiogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKgoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoqCiogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwoqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQoqICAgIGRpc3RyaWJ1dGlvbi4KKgoqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKgoqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCioKKiBEaXNjbGFpbWVyCioKKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQoqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQoqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwoqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAoqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAoqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKiBEQU1BR0UuCioKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiBJbXBsZW1lbnRhdGlvbiBOb3RlcwoqKgoqIC0JYSBsZWFkaW5nIG1hcmtlciBvZiAvLyEgaXMgdXNlZC4gVGhlIHB1cnBvc2Ugb2Ygc3VjaCBhIHNlcXVlbmNlIGlzIHRvIGhlbHAgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdwoqCUFuIGV4YW1wbGUgaXM6CS8vIXJjID0gSENGX1NVQ0NFU1M7CioJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQoqCXByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAoqCWZpcnN0IGdsYW5jZQoqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CioJeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCiogLQlyZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCQkJCS8vIEhDRiBhbmQgTVNGIGNvbW1vbiBpbmNsdWRlIGZpbGUKI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCiNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CgojaWYgISBkZWZpbmVkIG9mZnNldG9mCiNkZWZpbmUgb2Zmc2V0b2YocyxtKSAgICgodW5zaWduZWQgaW50KSYoKChzICopMCktPm0pKQojZW5kaWYgLy8gb2Zmc2V0b2YKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludAkJCWNtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKTsKSENGX1NUQVRJQyBpbnQJCQlpbml0KCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICk7CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCkhDRl9TVEFUSUMgdm9pZAkJCWNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBNICk7CnZvaWQgCQkJCQljYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKdm9pZCAJCQkJCWNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApOwpIQ0ZfU1RBVElDIGludAkJCWNoZWNrX21pYyggSUZCUCBpZmJwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCkhDRl9TVEFUSUMgdm9pZAkJCWNhbGlicmF0ZSggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgaW50CQkJY21kX2NtcGwoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGhjZl8xNgkJZ2V0X2ZpZCggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgdm9pZAkJCWlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKI2lmIEhDRl9ETUEKSENGX1NUQVRJQyBERVNDX1NUUkNUKglnZXRfZnJhbWVfbHN0KElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcpOwojZW5kaWYgLy8gSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsJLy9jaGFyKiwgYnl0ZSBjb3VudCAodXN1YWxseSBldmVuKQojaWYgSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApOwojZW5kaWYgLy8gSENGX0RNQQpIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludAkJCXNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApOwojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKc3RhdGljIGludCBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoKSENGX1NUQVRJQyBpbnQJCQlkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKTsKI2lmIChIQ0ZfRU5DQVApICYgSENGX0VOQwpIQ0ZfU1RBVElDIGhjZl84CQloY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKTsKI2VuZGlmIC8vIEhDRl9FTkNBUApIQ0ZfU1RBVElDIGhjZl84CQludWxsX2FkZHJbNF0gPSB7IDAsIDAsIDAsIDAgfTsKI2lmICEgZGVmaW5lZCBJTl9QT1JUX1dPUkQJCQkvL3JlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKZXh0ZXJuIEZJTEUgKmxvZ19maWxlOwoKI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlpbl9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpICkKCnN0YXRpYyBoY2ZfMTYgaW5fcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCApIHsKaGNmXzE2IGkgPSAoaGNmXzE2KV9pbnB3KCBwb3J0ICk7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5SICUyLjJ4ICU0LjR4IiwgKHBvcnQpJjB4RkYsIGkpOwoJfQoJcmV0dXJuIGk7Cn0gLy8gaW5fcG9ydF93b3JkCgojZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCW91dF9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQoKc3RhdGljIHZvaWQgb3V0X3BvcnRfd29yZCggaGNmX2lvIHBvcnQsIGhjZl8xNiB2YWx1ZSApIHsKCV9vdXRwdyggcG9ydCwgdmFsdWUgKTsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcblcgJTIuMDJ4ICU0LjA0eCIsIChwb3J0KSYweEZGLCB2YWx1ZSApOwoJfQp9Cgp2b2lkIElOX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogZHN0LCBpbnQgbikJewoJaW50IGkgPSAwOwoJaGNmXzE2IEZBUiAqIHA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5yZWFkIHN0cmluZ18zMiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDIuMnggdG8gYWRkciAlbHAiLAoJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCk7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQlwID0gKGhjZl8xNiBGQVIgKilkc3Q7CgkJKnArKyA9IChoY2ZfMTYpX2lucHcoIHBydCApOwoJCSpwICAgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpkc3QpOwoJCX0KCQlkc3QrKzsKCX0KfSAvLyBJTl9QT1JUX1NUUklOR18zMgoKdm9pZCBJTl9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBkc3QsIGludCBuKSB7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCgloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopZHN0OwkJCQkJCQkvL3RoaXMgbmVlZHMgbW9yZSBlbGFib3JhdGUgY29kZSBpbiBub24teDg2IHBsYXRmb3JtcwoJaW50IGkgPSAwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QgKTsKCX0KCXdoaWxlICggbi0tICkgewoJCSpwID0oaGNmXzE2KV9pbnB3KCBwcnQpOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWlmICggaSsrICUgMHgxMCApIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiJTA0eCAiLCAqcCk7CgkJCX0gZWxzZSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuJTA0eCAiLCAqcCk7CgkJCX0KCQl9CgkJcCsrOwoJfQp9IC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKCnZvaWQgT1VUX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogc3JjLCBpbnQgbikJewoJaW50IGkgPSAwOwoJaGNmXzE2IEZBUiAqIHA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGKTsKCX0KCXdoaWxlICggbi0tICkgewoJCXAgPSAoaGNmXzE2IEZBUiAqKXNyYzsKCQlfb3V0cHcoIHBydCwgKnArKyApOwoJCV9vdXRwdyggcHJ0LCAqcCAgICk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqc3JjKTsKCQl9CgkJc3JjKys7Cgl9Cn0gLy8gT1VUX1BPUlRfU1RSSU5HXzMyCgp2b2lkIE9VVF9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBzcmMsIGludCBuKQl7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCgloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopc3JjOwkJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKCWludCBpID0gMDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbndyaXRlIHN0cmluZ18xNiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDR4IiwgbiwgbiwgKGhjZl8xNilwcnQpOwoJfQoJd2hpbGUgKCBuLS0gKSB7CgkJKHZvaWQpX291dHB3KCBwcnQsICpwKTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOwoJCQl9IGVsc2UgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOwoJCQl9CgkJfQoJCXArKzsKCX0KfSAvLyBPVVRfUE9SVF9TVFJJTkdfOF8xNgoKI2VuZGlmIC8vIElOX1BPUlRfV09SRAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBIQ0ZfQVNTRVJUCklGQlAgQkFTRUQgYXNzZXJ0X2lmYnAgPSBOVUxMOwkJCS8vdG8gbWFrZSBhc3NlcnRzIGVhc2lseSB3b3JrIHVuZGVyIE1NRCBhbmQgREhGCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgojaWYgSENGX0VOQ0FQCi8qIFNOQVAgaGVhZGVyIHRvIGJlIGluc2VydGVkIGluIEV0aGVybmV0LUlJIGZyYW1lcyAqLwpIQ0ZfU1RBVElDICBoY2ZfOCBCQVNFRCBzbmFwX2hlYWRlcltdID0geyAweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLAkvLzUgYnl0ZXMgc2lnbmF0dXJlICsKCQkJCQkJCQkJCSAgMCB9OwkJCQkJCQkvLzEgYnl0ZSBwcm90b2NvbCBpZGVudGlmaWVyCiNlbmRpZiAvLyBIQ0ZfRU5DQVAKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCkhDRl9TVEFUSUMgaGNmXzggQkFTRUQgbWljX3BhZFs4XSA9IHsgMHg1QSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwkJLy9NSUMgcGFkZGluZyBvZiBtZXNzYWdlCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKQ0ZHX0lERU5USVRZX1NUUkNUIEJBU0VEIGNmZ19kcnZfaWRlbnRpdHkgPSB7CglzaXplb2YoY2ZnX2Rydl9pZGVudGl0eSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfSURFTlRJVFksCQkJLy8gKDB4MDgyNikKCU1TRl9DT01QT05FTlRfSUQsCglNU0ZfQ09NUE9ORU5UX1ZBUiwKCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSLAoJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKfSA7CgpDRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0gewoJc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9TVVBfUkFOR0UsCQkJLy8gKDB4MDgyNykKCglDT01QX1JPTEVfU1VQTCwKCUNPTVBfSURfRFVJLAoJe3sJRFVJX0NPTVBBVF9WQVIsCgkJRFVJX0NPTVBBVF9CT1QsCgkJRFVJX0NPTVBBVF9UT1AKCX19Cn0gOwoKc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwJCS8vICgweDA4MjgpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfUFJJLAoJewoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfUFJJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKCSB7CTMsCQkJCQkJCQkJLy92YXJfcmVjWzJdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0KCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwJCS8vICgweDA4MjkpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfU1RBLAoJewojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8xCgkgewkxLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8xX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMQojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8yCgkgewkyLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMgovLyBGb3IgTmF0aXZlX1VTQiAoTm90IHVzZWQhKQojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8zCgkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX1NUQV9WQVJfMwovLyBXYXJwCiNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzQKCSB7CTQsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzQKCX0KfSA7CgoKc3RydWN0IENGR19SQU5HRTZfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSwJCS8vICgweDA4MkEpCglDT01QX1JPTEVfQUNULAoJQ09NUF9JRF9IU0ksCgl7CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzAJCQkJCS8vIENvbnRyb2xsZWQgZGVwbG95bWVudAoJIHsJMCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0hTSV9WQVJfMAoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8yIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzMgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl80CQkJCQkvLyBIZXJtZXMtSUkgYWxsIHR5cGVzCgkgewk0LAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0sCiNlbHNlCgkgeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CiNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzUJCQkJCS8vIFdBUlAgSGVybWVzLTIuNQoJIHsJNSwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzUKCX0KfSA7CgoKQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0gewoJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECglDRkdfRFJWX0FDVF9SQU5HRVNfQVBGLAkJLy8gKDB4MDgyQikKCglDT01QX1JPTEVfQUNULAoJQ09NUF9JRF9BUEYsCgl7CiNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzEJCQkJLy8oRmFrZSkgSGVybWVzLUkKCSB7CTEsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMQojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yCQkJCS8vSGVybWVzLUlJCgkgewkyLAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQoJIH0sCiNlbHNlCgkgeyAwLCAwLCAwIH0sCiNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8yCiNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzMJCQkJCQkvLyBOYXRpdmVfVVNCCgkgewkzLAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMwojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl80CQkJCQkJLy8gV0FSUCBIZXJtZXMgMi41Cgkgewk0LAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9CiNlbHNlCgkgeyAwLCAwLCAwIH0KI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzQKCX0KfSA7CiNkZWZpbmUgSENGX1ZFUlNJT04gIFRFWFQoICJIQ0YkUmV2aXNpb246IDEuMTAgJCIgKQoKc3RhdGljIHN0cnVjdCAvKkNGR19IQ0ZfT1BUX1NUUkNUKi8gewoJaGNmXzE2CWxlbjsJCQkJCS8vbGVuZ3RoIG9mIGNmZ19oY2Zfb3B0IHN0cnVjdAoJaGNmXzE2CXR5cDsJCQkJCS8vdHlwZSAweDA4MkMKCWhjZl8xNgkgdjA7CQkJCQkJLy9vZmZzZXQgSENGX1ZFUlNJT04KCWhjZl8xNgkgdjE7CQkJCQkJLy8gTVNGX0NPTVBPTkVOVF9JRAoJaGNmXzE2CSB2MjsJCQkJCQkvLyBIQ0ZfQUxJR04KCWhjZl8xNgkgdjM7CQkJCQkJLy8gSENGX0FTU0VSVAoJaGNmXzE2CSB2NDsJCQkJCQkvLyBIQ0ZfQklHX0VORElBTgoJaGNmXzE2CSB2NTsJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYgKi8KCWhjZl8xNgkgdjY7CQkJCQkJLy8gSENGX0RNQQoJaGNmXzE2CSB2NzsJCQkJCQkvLyBIQ0ZfRU5DQVAKCWhjZl8xNgkgdjg7CQkJCQkJLy8gSENGX0VYVAoJaGNmXzE2CSB2OTsJCQkJCQkvLyBIQ0ZfSU5UX09OCgloY2ZfMTYJdjEwOwkJCQkJCS8vIEhDRl9JTwoJaGNmXzE2CXYxMTsJCQkJCQkvLyBIQ0ZfTEVHQUNZCgloY2ZfMTYJdjEyOwkJCQkJCS8vIEhDRl9NQVhfTFRWCgloY2ZfMTYJdjEzOwkJCQkJCS8vIEhDRl9QUk9UX1RJTUUKCWhjZl8xNgl2MTQ7CQkJCQkJLy8gSENGX1NMRUVQCgloY2ZfMTYJdjE1OwkJCQkJCS8vIEhDRl9UQUxMSUVTCgloY2ZfMTYJdjE2OwkJCQkJCS8vIEhDRl9UWVBFCgloY2ZfMTYJdjE3OwkJCQkJCS8vIEhDRl9OSUNfVEFMX0NOVAoJaGNmXzE2CXYxODsJCQkJCQkvLyBIQ0ZfSENGX1RBTF9DTlQKCWhjZl8xNgl2MTk7CQkJCQkJLy8gb2Zmc2V0IHRhbGxpZXMKCVRDSEFSCXZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKfSBCQVNFRCBjZmdfaGNmX29wdCA9IHsKCXNpemVvZihjZmdfaGNmX29wdCkvc2l6ZW9mKGhjZl8xNikgLTEsCglDRkdfSENGX09QVCwJCQkJLy8gKDB4MDgyQykKCSggc2l6ZW9mKGNmZ19oY2Zfb3B0KSAtIHNpemVvZihIQ0ZfVkVSU0lPTikgLSA0ICkvc2l6ZW9mKGhjZl8xNiksCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKCU1TRl9DT01QT05FTlRfSUQsCiNlbHNlCgkwLAojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoJSENGX0FMSUdOLAoJSENGX0FTU0VSVCwKCUhDRl9CSUdfRU5ESUFOLAoJMCwJCQkJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYqLywKCUhDRl9ETUEsCglIQ0ZfRU5DQVAsCglIQ0ZfRVhULAoJSENGX0lOVF9PTiwKCUhDRl9JTywKCUhDRl9MRUdBQ1ksCglIQ0ZfTUFYX0xUViwKCUhDRl9QUk9UX1RJTUUsCglIQ0ZfU0xFRVAsCglIQ0ZfVEFMTElFUywKCUhDRl9UWVBFLAojaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKCUhDRl9OSUNfVEFMX0NOVCwKCUhDRl9IQ0ZfVEFMX0NOVCwKCW9mZnNldG9mKElGQl9TVFJDVCwgSUZCX1RhbGx5TGVuICksCiNlbHNlCgkwLCAwLCAwLAojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCglIQ0ZfVkVSU0lPTgp9OyAvLyBjZmdfaGNmX29wdAojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoKI2lmIGRlZmluZWQgSENGX1RBTExJRVNfRVhUUkEKCXJlcGxhY2VkIGJ5IEhDRl9FWFRfVEFMTElFU19GVyA7CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19FWFRSQQoKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCB8fCAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgaGNmXzE2KiBCQVNFRCB4eHh4WyBdID0gewojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoJJmNmZ19udWxsLmxlbiwJCQkJCQkJLy9DRkdfTlVMTAkJCQkJCTB4MDgyMAojZW5kaWYgLy8gSENGX0VYVF9NQgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECgkmY2ZnX2Rydl9pZGVudGl0eS5sZW4sCQkJCQkvL0NGR19EUlZfSURFTlRJVFkgICAgICAgICAgICAgIDB4MDgyNgoJJmNmZ19kcnZfc3VwX3JhbmdlLmxlbiwJCQkJCS8vQ0ZHX0RSVl9TVVBfUkFOR0UgICAgICAgICAgICAgMHgwODI3CgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfUFJJICAgICAgICAweDA4MjgKCSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19TVEEJCTB4MDgyOQoJJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2kubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQkJMHgwODJBCgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZi5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfQVBGCQkweDA4MkIKCSZjZmdfaGNmX29wdC5sZW4sCQkJCQkJLy9DRkdfSENGX09QVAkJCQkJMHgwODJDCglOVUxMLAkJCQkJCQkJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgoJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAoJTlVMTAkJCQkJCQkJCS8vZW5kc2VudGluZWwKICB9OwojZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVAkoQVJSQVlfU0laRSh4eHh4KSAtIDMpCgojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqIFQgTyBQICAgTCBFIFYgRSBMICAgSCBDIEYgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQoqLlBVUlBPU0UJCUNoYW5nZXMgdGhlIHJ1bi10aW1lIENhcmQgYmVoYXZpb3IuCioJCQkJUGVyZm9ybXMgTWlzY2VsbGFudW91cyBhY3Rpb25zLgoqCiouQVJHVU1FTlRTCioJaWZicAkJCQkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYWN0aW9uCQkJCQludW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgY2hhbmdlCioJIC0gSENGX0FDVF9DQ1hfT0ZGCQlkaXNhYmxlIENLSVAKKgkgLSBIQ0ZfQUNUX0NDWF9PTgkJZW5hYmxlIENLSVAKKgkgLSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTgllbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKKgkgLSBIQ0ZfQUNUX0lOVF9PRkYJCWRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKKgkgLSBIQ0ZfQUNUX0lOVF9PTgkJY29tcGVuc2F0ZSAxIEhDRl9BQ1RfSU5UX09GRiwgZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGlmIGJhbGFuY2UgcmVhY2hlZAoqCSAtIEhDRl9BQ1RfUFJTX1NDQU4JCUhlcm1lcyBQcm9iZSBSZXNwb25zIFNjYW4gKEYxMDIpIGNvbW1hbmQKKgkgLSBIQ0ZfQUNUX1JYX0FDSwkJYWNrbm93bGVkZ2Ugbm9uLURNQSByZWNlaXZlciB0byBIZXJtZXMKKgkgLSBIQ0ZfQUNUX1NDQU4JCQlIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQoqCSAtIEhDRl9BQ1RfU0xFRVAJCUREUyBTbGVlcCByZXF1ZXN0CioJIC0gSENGX0FDVF9UQUxMSUVTCQlIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjb21tYW5kCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MJCQkJYWxsIChpbmNsdWRpbmcgaW52YWxpZCkKKglIQ0ZfSU5UX1BFTkRJTkcJCQlIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCioJSENGX0VSUl9OT19OSUMJCQlIQ0ZfQUNUX0lOVF9PRkYsIE5JQyBwcmVzZW5jZSBjaGVjayBmYWlscwoqCiouQ09ORElUSU9OUwoqIEV4Y2VwdCBmb3IgaGNmX2FjdGlvbiB3aXRoIEhDRl9BQ1RfSU5UX0ZPUkNFX09OIG9yIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIgb3IgaGNmX2Nvbm5lY3Qgd2l0aCBhbiBJL08KKiBhZGRyZXNzIChpLmUuIG5vdCBIQ0ZfRElTQ09OTkVDVCksIGFsbCBoY2YtZnVuY3Rpb24gY2FsbHMgTVVTVCBiZSBwcmVjZWVkZWQgYnkgYSBjYWxsIG9mIGhjZl9hY3Rpb24gd2l0aAoqIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIuCiogTm90ZSB0aGF0IGhjZl9jb25uZWN0IGRlZmF1bHRzIHRvIE5JQyBpbnRlcnJ1cHQgZGlzYWJsZWQgbW9kZSwgaS5lLiBhcyBpZiBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX0lOVF9PRkYgKQoqIHdhcyBjYWxsZWQuCioKKi5ERVNDUklQVElPTgoqIGhjZl9hY3Rpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtb2RlIGNoYW5naW5nIGFjdGlvbi1jb2RlIHBhaXJzIHRoYXQgYXJlIGFudG9ueW1zCioJIC0gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKgkgLSBIQ0ZfQUNUX0lOVF9bRk9SQ0VfXU9OIC8gSENGX0FDVF9JTlRfT0ZGCioKKiBBZGRpdGlvbmFsbHkgaGNmX2FjdGlvbiBjYW4gc3RhcnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGluIHRoZSBOSUM6CioJIC0gSENGX0FDVF9QUlNfU0NBTgoqCSAtIEhDRl9BQ1RfUlhfQUNLCioJIC0gSENGX0FDVF9TQ0FOCioJIC0gSENGX0FDVF9TTEVFUAoqCSAtIEhDRl9BQ1RfVEFMTElFUwoqCiogbyBIQ0ZfQUNUX0lOVF9PRkY6IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBEaXNhYmxlZC4KKiBUaGlzIGNvbW1hbmQsIGFuZCB0aGUgYXNzb2NpYXRlZCBbRm9yY2VdIEVuYWJsZSBOSUMgaW50ZXJydXB0cyBjb21tYW5kLCBhcmUgb25seSBhdmFpbGFibGUgaWYgdGhlIEhDRl9JTlRfT04KKiBjb21waWxlIHRpbWUgb3B0aW9uIGlzIG5vdCBzZXQgYXQgMHgwMDAwLgoqCiogbyBIQ0ZfQUNUX0lOVF9PTjogU2V0cyBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCiogRW5hYmxlIE5JQyBJbnRlcnJ1cHRzLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgoqCiogbyBIQ0ZfQUNUX0lOVF9GT1JDRV9PTjogRm9yY2UgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLgoqIFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLCByZWdhcmRsZXNzIG9mZiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCioKKiBUaGUgZGlzYWJsaW5nIGFuZCBlbmFibGluZyBvZiBpbnRlcnJ1cHRzIGFyZSBhbnRvbnltcy4KKiBUaGVzZSBhY3Rpb25zIG11c3QgYmUgYmFsYW5jZWQuCiogRm9yIGVhY2ggImRpc2FibGUgaW50ZXJydXB0cyIgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nICJlbmFibGUgaW50ZXJydXB0cyIuCiogVGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgd2l0aG91dCBpbnRlcnZlbmluZyBlbmFibGUgaW50ZXJydXB0cywgaW4KKiBvdGhlciB3b3JkcywgdGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgbmVzdGVkLgoqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgYXQgdGhlIGZpcnN0IGNhbGwgd2l0aCBIQ0ZfQUNUX0lOVF9PRkYuCiogVGhlIGludGVycnVwdCBnZW5lcmF0aW9uIG1lY2hhbmlzbSBpcyByZS1lbmFibGVkIHdoZW4gdGhlIG51bWJlciBvZiBjYWxscyB3aXRoIEhDRl9BQ1RfSU5UX09OIG1hdGNoZXMgdGhlCiogbnVtYmVyIG9mIGNhbGxzIHdpdGggSU5UX09GRi4KKgoqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGhhdmUgbW9yZSBFbmFibGUgTklDIEludGVycnVwdHMgY2FsbHMgdGhhbiBEaXNhYmxlIE5JQyBJbnRlcnJ1cHRzIGNhbGxzLgoqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgaW5pdGlhbGx5IChpLmUuIGFmdGVyIGhjZl9jb25uZWN0KSBkaXNhYmxlZC4KKiBBbiBNU0YgYmFzZWQgb24gYSBpbnRlcnJ1cHQgc3RyYXRlZ3kgbXVzdCBjYWxsIGhjZl9hY3Rpb24gd2l0aCBJTlRfT04gaW4gaXRzIGluaXRpYWxpemF0aW9uIGxvZ2ljLgoqCiohCVRoZSBJTlRfT0ZGL0lOVF9PTiBob3VzZWtlZXBpbmcgaXMgaW5pdGlhbGl6ZWQgYXQgMHgwMDAwIGJ5IGhjZl9jb25uZWN0LCBjYXVzaW5nIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgoqCW1lY2hhbmlzbSB0byBiZSBkaXNhYmxlZCBhdCBmaXJzdC4gVGhpcyBzdWl0cyBNU0YgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBwb2xsaW5nIHN0cmF0ZWd5LgoqCiogbyBIQ0ZfQUNUX0NDWF9PRkYgLyBIQ0ZfQUNUX0NDWF9PTgoqISEgVGhpcyBjYW4gdXNlIHNvbWUgbW9yZSBleHBsYW5hdGlvbjs/CiogRGlzYWJsZXMgYW5kIEVuYWJsZXMgc3VwcG9ydCBpbiB0aGUgSENGIHJ1bnRpbWUgY29kZSBmb3IgdGhlIENDWCBmZWF0dXJlLiBFYWNoIHRpbWUgb25lIG9mIHRoZXNlIGFjdGlvbgoqIGNvZGVzIGlzIHVzZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgdXNlIGNlYXNlLgoqCiogbyBIQ0ZfQUNUX1NMRUVQOiBJbml0aWF0ZXMgdGhlIERpc2Nvbm5lY3RlZCBEZWVwU2xlZXAgcHJvY2VzcwoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKKiBzbGVlcCBoYW5kc2hha2luZy4gUmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBIb3N0IGluaXRpYXRlcyBhIERpc2Nvbm5lY3RlZCBEZWVwU2xlZXAgKEREUykgb3IgdGhlIEYvVyBpbml0aWF0ZXMKKiBhIENvbm5lY3RlZCBEZWVwU2xlZXAgKENEUyksIHRoZSBIb3N0LUYvVyBzbGVlcCBoYW5kc2hha2luZyBpcyBjb21wbGV0ZWQgd2hlbiB0aGUgTklDIEludGVycnVwdHMgbW9kZSBpcwoqIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgoqIFRoZSBGL1cgaXMgd29rZW51cCBieSB0aGUgSENGIHdoZW4gdGhlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgYXJlIGRpc2FibGVkLCBpLmUuIGF0IHRoZSBmaXJzdCBIQ0ZfQUNUX0lOVF9PRkYKKiBhZnRlciBnb2luZyBpbnRvIHNsZWVwLgoqCiogVGhlIGZvbGxvd2luZyBNaXNjZWxsYW51b3VzIGFjdGlvbnMgYXJlIGRlZmluZWQ6CioKKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQoqIEFja2luZyB0aGUgcmVjZWl2ZXIsIGZyZWVzIHRoZSBOSUMgbWVtb3J5IHVzZWQgdG8gaG9sZCB0aGUgUnggZnJhbWUgYW5kIGFsbG93cyB0aGUgRi9XIHRvCiogcmVwb3J0IHRoZSBleGlzdGVuY2Ugb2YgdGhlIG5leHQgUnggZnJhbWUuCiogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKKiBsb29rIGFoZWFkIG9yIGNvcGllZCB0byBhbm90aGVyIGJ1ZmZlciwgdGhlIHJlY2VpdmVyIG1heSBiZSBhY2tlZC4gQWNraW5nIGVhcmxpZXIgaXMgYXNzdW1lZCB0byBoYXZlIHRoZQoqIHBvdGVudGlhbCBvZiBpbXByb3ZpbmcgdGhlIHBlcmZvcm1hbmNlLgoqIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKKiAtIHRoZSByZWNlaXZlZCBmcmFtZSBmaXRzIGluIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciwgYnkgdGhlIGhjZl9zZXJ2aWNlX25pYyBjYWxsIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lCiogLSBpZiBub3QgaW4gdGhlIGFib3ZlIHN0ZXAsIGJ5IGhjZl9yY3ZfbXNnIChhc3N1bWluZyBoY2ZfcmN2X21zZyBpcyBjYWxsZWQpCiogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgoqCXRoZSBoY2Zfc2VydmljZV9uaWMgdGhhdCByZXBvcnRlZCB0aGUgUnggZnJhbWUuCiogTm90ZTogSWYgYW4gUnggZnJhbWUgaXMgYWxyZWFkeSBhY2tlZCwgYW4gZXhwbGljaXQgQUNLIGJ5IHRoZSBNU0YgYWN0cyBhcyBhIE5vT3BlcmF0aW9uLgoqCiogbyBIQ0ZfQUNUX1RBTExJRVM6IElucXVpcmUgVGFsbGllcyBjb21tYW5kCiogVGhpcyBjb21tYW5kIGlzIG9ubHkgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgoqIFRoZSBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZCByZXF1ZXN0cyB0aGUgRi9XIHRvIHByb3ZpZGUgaXRzIGN1cnJlbnQgc2V0IG9mIHRhbGxpZXMuCiogU2VlIGFsc28gaGNmX2dldF9pbmZvIHdpdGggQ0ZHX1RBTExJRVMgYXMgcGFyYW1ldGVyLgoqCiogbyBIQ0ZfQUNUX1BSU19TQ0FOOiBJbnF1aXJlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kCiogVGhpcyBjb21tYW5kIGlzIG9ubHkgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgoqIFRoZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZCBzdGFydHMgYSBzY2FuIHNlcXVlbmNlLgoqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKgoqIG8gSENGX0FDVF9TQ0FOOiBJbnF1aXJlIFNjYW4gY29tbWFuZAoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSElJIEYvVyAoaS5lLiBwcmUtV0FSUCkgYW5kIGl0IGlzIG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKiBUaGUgSW5xdWlyZSBTY2FuIGNvbW1hbmQgc3RhcnRzIGEgc2NhbiBzZXF1ZW5jZS4KKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKiAtIGFuIGludmFsaWQgY29kZSBpcyBzcGVjaWZpZWQgaW4gcGFyYW1ldGVyIGFjdGlvbi4KKiAtIEhDRl9BQ1RfSU5UX09OIGNvbW1hbmRzIG91dG51bWJlciB0aGUgSENGX0FDVF9JTlRfT0ZGIGNvbW1hbmRzLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCioJbXVsdGktdGhyZWFkaW5nCioKKiAtIFNpbmNlIHRoZSBIQ0YgZG9lcyBub3QgbWFpbnRhaW4gc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBGL1cgZW5hYmxlZCBzdGF0ZSwgaXQgaXMgbm90IGFzc2VydGVkCioJd2hldGhlciBIQ0ZfQUNUX1NDQU4sIEhDRl9BQ1RfUFJTX1NDQU4gb3IgSENGX0FDVF9UQUxMSUVTIGFyZSBvbmx5IHVzZWQgd2hpbGUgRi9XIGlzIGVuYWJsZWQuCioKKi5ESUFHUkFNCiogMDogVGhlIGFzc2VydCBlbWJlZGRlZCBpbiBIQ0ZMT0dFTlRSWSBjaGVja3MgYWdhaW5zdCByZS1lbnRyYW5jeS4gUmUtZW50cmFuY3kgY291bGQgYmUgY2F1c2VkIGJ5IGEgTVNGIGxvZ2ljCioJYXQgdGFzay1sZXZlbCBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBzaGllbGRpbmcgd2l0aCBIQ0ZfQUNUX09OL19PRkYuIEhvd2V2ZXIgdGhlIEhDRl9BQ1RfSU5UX09GRgoqCWFjdGlvbiBpdHNlbGYgY2FuIHBlciBkZWZpbml0aW9uIG5vdCBiZSBwcm90ZWN0ZWQgdGhpcyB3YXkuIEJhc2VkIG9uIGNvZGUgaW5zcGVjdGlvbiwgaXQgY2FuIGJlIGNvbmNsdWRlZCwKKgl0aGF0IHRoZXJlIGlzIG5vIHJlLWVudHJhbmN5IFBST0JMRU0gaW4gdGhpcyBwYXJ0aWN1bGFyIGZsb3cuIEl0IGRvZXMgbm90IHNlZW0gd29ydGggdGhlIHRyb3VibGUgdG8KKglleHBsaWNpdGx5IGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbiAoYWx0aG91Z2ggdGhlcmUgd2FzIGEgcmVwb3J0IG9mIGFuIE1TRiB3aGljaCByYW4gaW50byB0aGlzIGFzc2VydC4KKiAyOklGQl9JbnRPZmZDbnQgaXMgdXNlZCB0byBiYWxhbmNlIHRoZSBJTlRfT0ZGIGFuZCBJTlRfT04gY2FsbHMuICBEaXNhYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkKKgl3cml0aW5nIGEgemVybyB0byB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLiAgSW4gYSBzaGFyZWQgaW50ZXJydXB0IGVudmlyb25tZW50IChlLmcuIHRoZSBtaW5pLVBDSSBORElTCioJZHJpdmVyKSBpdCBpcyBjb25zaWRlcmVkIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlIHN0YXR1cyBIQ0ZfSU5UX1BFTkRJTkcgaWYgYW5kIG9ubHkgaWYsIHRoZSBjdXJyZW50CioJaW52b2NhdGlvbiBvZiBoY2Zfc2VydmljZV9uaWMgaXMgKGFwcGFyZW50bHkpIGNhbGxlZCBpbiB0aGUgSVNSIHdoZW4gdGhlIElTUiB3YXMgYWN0aXZhdGVkIGFzIHJlc3VsdCBvZiBhCioJY2hhbmdlIGluIEhSRUdfRVZfU1RBVCBtYXRjaGluZyBhIGJpdCBpbiBIUkVHX0lOVF9FTiwgaS5lLiBub3QgaWYgaW52b2tlZCBhcyByZXN1bHQgb2YgYW5vdGhlciBkZXZpY2UKKglnZW5lcmF0aW5nIGFuIGludGVycnVwdCBvbiB0aGUgc2hhcmVkIGludGVycnVwdCBsaW5lLgoqCU5vdGUgMTogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIGFkdmVyc2UgY29uZGl0aW9ucyBvbiBjZXJ0YWluIHBsYXRmb3JtcyB0aGUgd3JpdGluZyBvZgoqCUhSRUdfSU5UX0VOIGNhbiBhcHBhcmVudGx5IGZhaWwsIHRoZXJlZm9yIGl0IGlzIHBhcmFtb3VudCB0aGF0IEhSRUdfSU5UX0VOIGlzIHdyaXR0ZW4gYWdhaW4gd2l0aCAwIGZvcgoqCWVhY2ggYW5kIGV2ZXJ5IGNhbGwgdG8gSENGX0FDVF9JTlRfT0ZGLgoqCU5vdGUgMjogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIEgvVyAmIFMvVyBhcmNoaXRlY3R1cmVzIHRoaXMgbG9naWMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKglubyBOSUMgYXQgYWxsLiBUbyBjYXRlciBmb3IgdGhpcywgdGhlIHZhbHVlIG9mIEhSRUdfSU5UX0VOIGlzIHZhbGlkYXRlZC4gSWYgdGhlIHVudXNlZCBiaXQgMHgwMTAwIGlzIHNldCwKKglpdCBpcyBhc3N1bWVkIHRoZXJlIGlzIG5vIE5JQy4KKglOb3RlIDM6IER1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcywgc29tZSB2ZXJzaW9ucyBvZiB0aGUgRi9XIHJlc2V0IEhSRUdfU1dfMCwgaGVuY2UgY2hlY2tpbmcgdGhpcwoqCXJlZ2lzdGVyIGZvciBIQ0ZfTUFHSUMgKHRoZSBjbGFzc2ljYWwgTklDIHByZXNlbmNlIHRlc3QpIHdoZW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNhbGxlZCBkdWUgdG8gYW5vdGhlcgoqCWNhcmQgaW50ZXJydXB0aW5nIHZpYSBhIHNoYXJlZCBJUlEgZHVyaW5nIGEgZG93bmxvYWQsIGZhaWxzLgoqNDoJVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKKglwYXRoIGluIGVycm9yIGZyZWUgZmxvd3MpIGJ1dCBOT1QgZmFpbCBzYWZlIGluIGNhc2Ugb2YgdG9vIG1hbnkgSU5UX09OIGludm9jYXRpb25zIGNvbXBhcmVkIHRvIElOVF9PRkYpLgoqCUVuYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5IHdyaXRpbmcgdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4KKgkgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KKgkgLSBVbmRlciAibm9ybWFsIiBjb25kaXRpb25zLCB0aGUgSENGIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiBJbmZvIEV2ZW50cywgUnggRXZlbnRzIGFuZCBOb3RpZnkgRXZlbnRzLgoqCSAtIFdoZW4gdGhlIEhDRiBpcyBvdXQgb2YgVHgvTm90aWZ5IHJlc291cmNlcywgdGhlIEhDRiBpcyBhbHNvIGludGVyZXN0ZWQgaW4gQWxsb2MgRXZlbnRzLgoqCSAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCioJRm9yIERNQSBvcGVyYXRpb24sIHRoZSBETUEgaGFyZHdhcmUgaGFuZGxlcyB0aGUgYWxsb2MgZXZlbnRzLiBUaGUgRE1BIGVuZ2luZSB3aWxsIGdlbmVyYXRlIGEgJ1R4RG1hRG9uZScKKglldmVudCBhcyBzb29uIGFzIGl0IGhhcyBwdW1wZWQgYSBmcmFtZSBmcm9tIGhvc3QgcmFtIGludG8gTklDLVJBTSAobm90ZSB0aGF0IHRoZSBmcmFtZSBkb2VzIG5vdCBoYXZlIHRvIGJlCioJdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KKglob3N0IHJhbS4gIE5vdGUgdGhhdCB0aGUgJ2FsbG9jJyBldmVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGV2ZW50LW1hc2ssIGJlY2F1c2UgdGhlIERNQSBlbmdpbmUgd2lsbAoqCXJlYWN0IHRvIGFuZCBhY2tub3dsZWRnZSB0aGlzIGV2ZW50LgoqNjoJYWNrIHRoZSAib2xkIiBSeC1ldmVudC4gU2VlICJSeCBCdWZmZXIgZnJlZSBzdHJhdGVneSIgaW4gaGNmX3NlcnZpY2VfbmljIGFib3ZlIGZvciBtb3JlIGV4cGxhbmF0aW9uLgoqCUlGQl9SeEZJRCBhbmQgSUZCX1J4TGVuIG11c3QgYmUgY2xlYXJlZCB0byBicmluZyBib3RoIHRoZSBpbnRlcm5hbCBIQ0YgaG91c2Uga2VlcGluZyBhbmQgdGhlIGluZm9ybWF0aW9uCioJc3VwcGxpZWQgdG8gdGhlIE1TRiBpbiB0aGUgc3RhdGUgIm5vIGZyYW1lIHJlY2VpdmVkIi4KKjg6CVRoZSBIQ0ZfQUNUX1NDQU4sIEhDRl9BQ1RfUFJTX1NDQU4gYW5kIEhDRl9BQ1RfVEFMTElFUyBhY3Rpdml0eSBhcmUgbWVyZ2VkIGJ5ICJjbGV2ZXIiIGFsZ2VicmFpYwoqCW1hbmlwdWxhdGlvbnMgb2YgdGhlIFJJRC12YWx1ZXMgYW5kIGFjdGlvbiBjb2Rlcywgc28gZm9yZWdvaW5nIHJvYnVzdG5lc3MgYWdhaW5zdCBtaWdyYXRpb24gcHJvYmxlbXMgZm9yCioJZWFzZSBvZiBpbXBsZW1lbnRhdGlvbi4gVGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZAoqCUhDRl9BQ1RfVEFMTElFUyBldGMgYXJlIGNoZWNrZWQgYnkgdGhlICIjaWYiIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGUgYm9keSBvZiB0aGlzIHJvdXRpbmUsIHJlc3VsdGluZwoqCWluOiBlcnIgIm1haW50ZW5hbmNlIiBkdXJpbmcgY29tcGlsYXRpb24gaWYgdGhlIGFzc3VtcHRpb25zIGFyZSBubyBsb25nZXIgbWV0LiBUaGUgd3JpdGluZyBvZiBIUkVHX1BBUkFNXzEKKgl3aXRoIDB4M0ZGRiBpbiBjYXNlIG9mIGFuIFBSUyBzY2FuLCBpcyBhIGtsdWRnZSB0byBnZXQgYXJvdW5kIGxhY2sgb2Ygc3BlY2lmaWNhdGlvbiwgaGVuY2UgZGlmZmVyZW50CioJaW1wbGVtZW50YXRpb24gaW4gRi9XIGFuZCBIb3N0LgoqCVdoZW4gdGhlcmUgaXMgbm8gTklDIFJBTSBhdmFpbGFibGUsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEhlcm1lcyBGL1cgZG8gcmVwb3J0IDB4N0YwMCBhcyBlcnJvciBpbiB0aGUKKglSZXN1bHQgZmllbGQgb2YgdGhlIFN0YXR1cyByZWdpc3RlciBhbmQgc29tZSBGL1cgdmVyc2lvbnMgZG9uJ3QuIFRvIG1hc2sgdGhpcyBkaWZmZXJlbmNlIHRvIHRoZSBNU0YgYWxsCioJcmV0dXJuIGNvZGVzIG9mIHRoZSBIZXJtZXMgYXJlIGlnbm9yZWQgKCJiZXN0IiBhbmQgIm1vc3Qgc2ltcGxlIiBzb2x1dGlvbiB0byB0aGVzZSB0eXBlcyBvZiBhbmFsb21pZXMgd2l0aAoqCWFuIGFjY2VwdGFibGUgbG9zcyBkdWUgdG8gaWdub3JpbmcgYWxsIGVycm9yIHNpdHVhdGlvbnMgYXMgd2VsbCkuCioJVGhlICJObyBpbnF1aXJlIHNwYWNlIiBpcyByZXBvcnRlZCB2aWEgdGhlIEhlcm1lcyB0YWxsaWVzLgoqMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKI2lmIENGR19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9TQ0FOCmVycjogIm1haW50ZW5hbmNlIiBhcHBhcmVudGx5IGludmlvbGF0ZWQgdGhlIHVuZGVybHlpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aGVzZSBtYWNyb3MKI2VuZGlmCiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CiNpZiBDRkdfUFJTX1NDQU4gIT0gQ0ZHX1RBTExJRVMgLSBIQ0ZfQUNUX1RBTExJRVMgKyBIQ0ZfQUNUX1BSU19TQ0FOCmVycjogIm1haW50ZW5hbmNlIiBhcHBhcmVudGx5IGludmlvbGF0ZWQgdGhlIHVuZGVybHlpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aGVzZSBtYWNyb3MKI2VuZGlmCmludApoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQp7CmludAlyYyA9IEhDRl9TVUNDRVNTOwoKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKI2lmIEhDRl9JTlRfT04KCUhDRkxPR0VOVFJZKCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04gPyBIQ0ZfVFJBQ0VfQUNUSU9OX0tMVURHRSA6IEhDRl9UUkFDRV9BQ1RJT04sIGFjdGlvbiApCQkJCQkJCQkJCQkJCQkvKiAwICovCiNpZiAoSENGX1NMRUVQKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGLAoJCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApCiNlbHNlCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBhY3Rpb24gKQojZW5kaWYgLy8gSENGX1NMRUVQCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGIHx8CgkJCSAgIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9PRkYgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX0ZPUkNFX09OLCAgYWN0aW9uICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA8PSAxNiB8fCBpZmJwLT5JRkJfSW50T2ZmQ250ID49IDB4RkZGRSwKCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQkvL25lc3RpbmcgbW9yZSB0aGFuIDE2IGRlZXAgc2VlbXMgdW5yZWFzb25hYmxlCiNlbmRpZiAvLyBIQ0ZfSU5UX09OCgoJc3dpdGNoIChhY3Rpb24pIHsKI2lmIEhDRl9JTlRfT04KaGNmXzE2CWk7CgkgIGNhc2UgSENGX0FDVF9JTlRfT0ZGOgkJCQkJCS8vIERpc2FibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KI2lmIEhDRl9TTEVFUAoJCWlmICggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUgKSB7CS8vIFdha2VVcCB0ZXN0CTs/dGllIHRoaXMgdG8gdGhlICJuZXciIHN1cGVyLUxpbmtTdGF0CgkJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsJCQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7CQkvLyBzZXQgd2FrZXVwIGJpdAoJCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0IHRvIGNvdW50ZXJhY3QgdGhlIGNsZWFyaW5nIGJ5IEYvVwoJCQkvLyA4MDAgdXMgbGF0ZW5jeSBiZWZvcmUgRlcgc3dpdGNoZXMgdG8gaGlnaCBwb3dlcgoJCQlNU0ZfV0FJVCg4MDApOwkJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KLy9PT1IJCWlmICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0RTX09PUiApIHsgLy8gT3V0T2ZSYW5nZQovLwkJCQlwcmludGsoICI8NT5BQ1RfSU5UX09GRjogRGVlcHNsZWVwIHBoYXNlIHRlcm1pbmF0ZWQsIGVuYWJsZSBhbmQgZ28gdG8gQXdhaXRDb25uZWN0aW9uXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vCQkJCWhjZl9jbnRsKCBpZmJwLCBIQ0ZfQ05UTF9FTkFCTEUgKTsKLy8JCQl9Ci8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsJLy9jbGVhciBJUi9PT1Igc3RhdGUKCQl9CiNlbmRpZiAvLyBIQ0ZfU0xFRVAKLyoyKi8JaWZicC0+SUZCX0ludE9mZkNudCsrOwovLyEgICAgIHJjID0gMDsKCQlpID0gSVBXKCBIUkVHX0lOVF9FTiApOwoJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsKCQlpZiAoIGkgJiAweDEwMDAgKSB7CgkJCXJjID0gSENGX0VSUl9OT19OSUM7CgkJfSBlbHNlIHsKCQkJaWYgKCBpICYgSVBXKCBIUkVHX0VWX1NUQVQgKSApIHsKCQkJCXJjID0gSENGX0lOVF9QRU5ESU5HOwoJCQl9CgkJfQoJCWJyZWFrOwoKCSAgY2FzZSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTjoJCQkJLy8gRW5mb3JjZSBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KCQlpZmJwLT5JRkJfSW50T2ZmQ250ID0gMDsKCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX0lOVF9PTgoKCSAgY2FzZSBIQ0ZfQUNUX0lOVF9PTjoJCQkJCQkvLyBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KLyo0Ki8JaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCAmJiBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsKCQkJCQkJCQkJCQkJLy9kZXRlcm1pbmUgSW50ZXJydXB0IEV2ZW50IG1hc2sKI2lmIEhDRl9ETUEKCQkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CgkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SRE1BRCB8IEhSRUdfRVZfVERNQUQgfCBIUkVHX0VWX1RYX0VYVDsJLy9tYXNrIHdoZW4gRE1BIGFjdGl2ZQoJCQl9IGVsc2UKI2VuZGlmIC8vIEhDRl9ETUEKCQkJewoJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUlggfCBIUkVHX0VWX1RYX0VYVDsJCQkJCQkvL21hc2sgd2hlbiBETUEgbm90IGFjdGl2ZQoJCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CgkJCQkJaSB8PSBIUkVHX0VWX0FMTE9DOwkJCQkJCQkJCQkJCS8vbWFzayB3aGVuIG5vIFR4RklEIGF2YWlsYWJsZQoJCQkJfQoJCQl9CiNpZiBIQ0ZfU0xFRVAKCQkJaWYgKCAoIElQVyhIUkVHX0VWX1NUQVQpICYgKCBpIHwgSFJFR19FVl9TTEVFUF9SRVEgKSApID09IEhSRUdfRVZfU0xFRVBfUkVRICkgewoJCQkJLy8gZmlybXdhcmUgaW5kaWNhdGVzIGl0IHdvdWxkIGxpa2UgdG8gZ28gaW50byBzbGVlcCBtb2R1cwoJCQkJLy8gb25seSBhY2tub3dsZWRnZSB0aGlzIHJlcXVlc3QgaWYgbm8gb3RoZXIgZXZlbnRzIHRoYXQgY2FuIGNhdXNlIGFuIGludGVycnVwdCBhcmUgcGVuZGluZwoJCQkJaWZicC0+SUZCX0ludE9mZkNudC0tOwkJCS8vYmVjb21lcyAweEZGRkUKICAgICAgICAgICAgCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1RJQ0sgKTsKCQkJCU9QVyggSFJFR19FVl9BQ0ssIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9USUNLIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7CgkJCX0gZWxzZQojZW5kaWYgLy8gSENGX1NMRUVQCgkJCXsKICAgICAgICAgICAgCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApOwoJCQl9CgkJfQoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0lOVF9PTgoKI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwoJICBjYXNlIEhDRl9BQ1RfU0xFRVA6CQkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRElTQUJMRSApOwoJCWNtZF9leGUoIGlmYnAsIEhDTURfU0xFRVAsIDAgKTsKCQlicmVhazsKLy8gCSAgY2FzZSBIQ0ZfQUNUX1dBS0VVUDoJCQkJCQkvLyBERFMgV2FrZXVwIHJlcXVlc3QKLy8gCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKLy8gCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKLy8gCQlPUFcoIEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7Ci8vIAkJTVNGX1dBSVQoODAwKTsJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KLy8gCQlyYyA9IGhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfSU5UX09GRiApOwkvKmJvZ3VzLCBJRkJfSW50T2ZmQ250ID09IDB4RkZGRiwgc28gaWYgeW91IGNhcmVmdWxseSBsb29rCi8vIAkJCQkJCQkJCQkJCQkgKmF0IHRoZSAjaWYgSENGX0REUyBzdGF0ZW1lbnRzLCBIQ0ZfQUNUX0lOVF9PRkYgaXMgZW1wdHkKLy8gCQkJCQkJCQkJCQkJCSAqZm9yIEREUy4gIk11Y2giIGJldHRlciB3b3VsZCBiZSB0byBtZXJnZSB0aGUgZmxvd3MgZm9yCi8vIAkJCQkJCQkJCQkJCQkgKkREUyBhbmQgREVFUF9TTEVFUAovLyAJCQkJCQkJCQkJCQkJICovCi8vIAkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfRERTCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJICBjYXNlIEhDRl9BQ1RfQ0NYX09OOgkJCQkJCS8vIGVuYWJsZSBDS0lQCgkgIGNhc2UgSENGX0FDVF9DQ1hfT0ZGOgkJCQkJCS8vIGRpc2FibGUgQ0tJUAoJCWlmYnAtPklGQl9DS0lQU3RhdCA9IGFjdGlvbjsKCQlicmVhazsKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoKCSAgY2FzZSBIQ0ZfQUNUX1JYX0FDSzoJCQkJCQkvL1JlY2VpdmVyIEFDSwovKjYqLwlpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKCQkJREFXQV9BQ0soIEhSRUdfRVZfUlggKTsKCQl9CgkJaWZicC0+SUZCX1J4RklEID0gaWZicC0+SUZCX1J4TGVuID0gMDsKCQlicmVhazsKCi8qOCovIGNhc2UJSENGX0FDVF9QUlNfU0NBTjoJCQkJCS8vIEhlcm1lcyBQUlMgU2NhbiAoRjEwMikKCQlPUFcoIEhSRUdfUEFSQU1fMSwgMHgzRkZGICk7CgkJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfVEFMTElFUwoJICBjYXNlIEhDRl9BQ1RfVEFMTElFUzoJCQkJCQkvLyBIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKQojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKCSAgY2FzZSBIQ0ZfQUNUX1NDQU46CQkJCQkJLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkKI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKCQkvKiEhIHRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQgSENGX0FDVF9UQUxMSUVTIGV0YwoJCSAqICAgYXJlIGNoZWNrZWQgYnkgI2lmIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGlzIHJvdXRpbmUgcmVzdWx0aW5nIGluOiBlcnIgIm1haW50ZW5hbmNlIgkqLwoJCWNtZF9leGUoIGlmYnAsIEhDTURfSU5RVUlSRSwgYWN0aW9uIC0gSENGX0FDVF9UQUxMSUVTICsgQ0ZHX1RBTExJRVMgKTsKCQlicmVhazsKCgkgIGRlZmF1bHQ6CgkJSENGQVNTRVJUKCBET19BU1NFUlQsIGFjdGlvbiApCgkJYnJlYWs7Cgl9CgkvLyEgZG8gbm90IEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkJCQkJCQkJCQkJCQkJCS8qIDMwKi8KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9BQ1RJT04gKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9hY3Rpb24KI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCiouUFVSUE9TRQkJQ29ubmVjdCBvciBkaXNjb25uZWN0IGEgc3BlY2lmaWMgcG9ydCB0byBhIHNwZWNpZmljIG5ldHdvcmsuCiohISAgOz8/Pz8/Pz8/Pz8/Pz8/Pz8gY29udGludWUgbmVlZHMgbW9yZSBleHBsYW5hdGlvbgoqCQkJCXJlY292ZXJzIGJ5IG1lYW5zIG9mICJjb250aW51ZSIgd2hlbiB0aGUgY29ubmVjdCBwcm9jZXMgaW4gQ0NYIG1vZGUgZmFpbHMKKgkJCQlFbmFibGVzIG9yIGRpc2FibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBOSUMuCioJCQkJQWN0aXZhdGVzIHN0YXRpYyBOSUMgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBwb3J0IGF0IGNvbm5lY3QuCioJCQkJQWN0aXZhdGVzIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMgYXQgZW5hYmxlLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJY21kCQkJMHgwMDFGOglIZXJtZXMgY29tbWFuZCAoZGlzYWJsZSwgZW5hYmxlLCBjb25uZWN0LCBkaXNjb25uZWN0LCBjb250aW51ZSkKKgkJCQkJSENGX0NOVExfRU5BQkxFCQlFbmFibGUKKgkJCQkJSENGX0NOVExfRElTQUJMRSAgICBEaXNhYmxlCioJCQkJCUhDRl9DTlRMX0NPTlRJTlVFCUNvbnRpbnVlCioJCQkJCUhDRl9DTlRMX0NPTk5FQ1QgICAgQ29ubmVjdAoqCQkJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUIERpc2Nvbm5lY3QKKgkJCQkweDAxMDA6IGNvbW1hbmQgcXVhbGlmaWVyIChjb250aW51ZSkKKgkJCQkJSENNRF9SRVRSWQkJCXJldHJ5IGZsYWcKKgkJCQkweDA3MDA6ICBwb3J0IG51bWJlciAoY29ubmVjdC9kaXNjb25uZWN0KQoqCQkJCQlIQ0ZfUE9SVF8wICAgICAgICAgIE1BQyBQb3J0IDAKKgkJCQkJSENGX1BPUlRfMSAgICAgICAgICBNQUMgUG9ydCAxCioJCQkJCUhDRl9QT1JUXzIgICAgICAgICAgTUFDIFBvcnQgMgoqCQkJCQlIQ0ZfUE9SVF8zICAgICAgICAgIE1BQyBQb3J0IDMKKgkJCQkJSENGX1BPUlRfNCAgICAgICAgICBNQUMgUG9ydCA0CioJCQkJCUhDRl9QT1JUXzUgICAgICAgICAgTUFDIFBvcnQgNQoqCQkJCQlIQ0ZfUE9SVF82ICAgICAgICAgIE1BQyBQb3J0IDYKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwoqISEJdmlhIGNtZF9leGUKKglIQ0ZfRVJSX05PX05JQwoqCUhDRl9FUlJfREVGVU5DVF8uLi4KKglIQ0ZfRVJSX1RJTUVfT1VUCioKKi5ERVNDUklQVElPTgoqIFRoZSBwYXJhbWV0ZXIgY21kIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YmZpZWxkcy4KKiBUaGUgYWN0dWFsIHZhbHVlIGZvciBjbWQgaXMgY3JlYXRlZCBieSBsb2dpY2FsIG9yLWluZyB0aGUgYXBwcm9wcmlhdGUgbW5lbW9uaWNzIGZvciB0aGUgc3ViZmllbGRzLgoqIFRoZSBmaWVsZCAweDAwMUYgY29udGFpbnMgdGhlIGNvbW1hbmQgY29kZQoqICAtIEhDRl9DTlRMX0VOQUJMRQoqICAtIEhDRl9DTlRMX0RJU0FCTEUKKiAgLSBIQ0ZfQ05UTF9DT05ORUNUCiogIC0gSENGX0NOVExfRElTQ09OTkVDVAoqICAtIEhDRl9DTlRMX0NPTlRJTlVFCioKKiBGb3IgSENGX0NOVExfQ09OVElOVUUsIHRoZSBmaWVsZCAweDAxMDAgY29udGFpbnMgdGhlIHJldHJ5IGZsYWcgSENNRF9SRVRSWS4KKiBGb3IgSENGX0NOVExfQ09OTkVDVCBhbmQgSENGX0NOVExfRElTQ09OTkVDVCwgdGhlIGZpZWxkIDB4MDcwMCBjb250YWlucyB0aGUgcG9ydCBudW1iZXIgYXMgSENGX1BPUlRfIy4KKiBGb3IgU3RhdGlvbiBhcyB3ZWxsIGFzIEFjY2Vzc1BvaW50IEYvVywgTUFDIFBvcnQgMCBpcyB0aGUgIm5vcm1hbCIgY29tbXVuaWNhdGlvbiBjaGFubmVsLgoqIEZvciBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDEgdGhyb3VnaCA2IGNvbnRyb2wgdGhlIFdEUyBsaW5rcy4KKgoqIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBuYW1lcyBIQ0ZfQ05UTF9ESVNBQkxFIGFuZCBIQ0ZfQ05UTF9FTkFCTEUsIGhjZl9jbnRsIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgTklDCiogSW50ZXJydXB0cyBtb2RlLgoqCiogVGhlIENvbm5lY3QgaXMgdXNlZCBieSB0aGUgTVNGIHRvIGJyaW5nIGEgcGFydGljdWxhciBwb3J0IGluIGFuIGluYWN0aXZlIHN0YXRlIGFzIGZhciBhcyBkYXRhIHRyYW5zbWlzc2lvbgoqIGFuZCByZWNlcHRpb24gYXJlIGNvbmNlcm5lZC4KKiBXaGVuIGEgcGFydGljdWxhciBwb3J0IGlzIGRpc2Nvbm5lY3RlZDoKKiAtIHRoZSBGL1cgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCiogLSB0aGUgRi9XIGlnbm9yZXMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgoqIC0gYWxsIGZyYW1lcyAoUmVjZWl2ZSBhcyB3ZWxsIGFzIHBlbmRpbmcgVHJhbnNtaXQpIGZvciB0aGF0IHBvcnQgb24gdGhlIE5JQyBhcmUgZGlzY2FyZGVkLgoqCiogV2hlbiB0aGUgTklDIGlzIGRpc2FibGVkLCBhYm92ZSBsaXN0IGFwcGxpZXMgdG8gYWxsIHBvcnRzLCBpLmUuIHRoZSByZXN1bHQgaXMgbGlrZSBhbGwgcG9ydHMgYXJlCiogZGlzY29ubmVjdGVkLgoqCiogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBjb25uZWN0ZWQ6CiogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwb3J0LgoqIC0gZW5hYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KKiAtIGFjY2VwdHMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgoqCiogRW5hYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMuCioJVGhlIEYvVyBvbmx5IHVwZGF0ZXMgaXRzIHN0YXRpYyBjb25maWd1cmF0aW9uIGF0IGEgdHJhbnNpdGlvbiBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQgb3IgZnJvbQoqCWRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQuCioJSW4gb3JkZXIgdG8gZW5mb3JjZSB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24sIHRoZSBNU0YgbXVzdCBhc3N1cmUgdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZS4KKglEdWUgdG8gc3VjaCBhIGRpc2FibGUvZW5hYmxlIG9yIGRpc2Nvbm5lY3QvY29ubmVjdCBzZXF1ZW5jZSwgUngvVHggZnJhbWVzIG1heSBiZSBsb3N0LCBpbiBvdGhlciB3b3JkcywKKgljb25maWd1cmF0aW9uIG1heSBpbXBhY3QgY29tbXVuaWNhdGlvbi4KKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBlbmFibGVkLgoqIE5vdGUgdGhhdCB0aGUgRW5hYmxlIEZ1bmN0aW9uIGJ5IGl0c2VsZiBvbmx5IGVuYWJsZXMgZGF0YSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgaXQKKiBkb2VzIG5vdCBlbmFibGUgdGhlIEludGVycnVwdCBHZW5lcmF0aW9uIG1lY2hhbmlzbS4gVGhpcyBpcyBkb25lIGJ5IGhjZl9hY3Rpb24uCioKKiBEaXNhYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKiEhICA7Pz8/Pz9pcyB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCByZWFsbHkgdHJ1ZQoqIC0gaXQgYWN0cyBhcyBhIGRpc2Nvbm5lY3Qgb24gYWxsIHBvcnRzLgoqIC0gVGhlIERNQSBFbmdpbmUgKGlmIGFwcGxpY2FibGUpIGlzIGRpc2FibGVkLgoqCiogRm9yIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kIG9uIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3R4L3J4X2dldCBzZWUgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zLgoqCiogQWx0aG91Z2ggdGhlIEVuYWJsZS9EaXNhYmxlIGFuZCBDb25uZWN0L0Rpc2Nvbm5lY3QgYXJlIGFudG9ueW1zLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGVpciBzZXF1ZW5jaW5nLAoqIGluIG90aGVyIHdvcmRzLCB0aGV5IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gYXJiaXRyYXJ5IHNlcXVlbmNlIHdpdGhvdXQgYmVpbmcgcGFpcmVkIG9yIGJhbGFuY2VkLgoqIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCwgdGhlIGVmZmVjdHMgb2YgdGhlIHByZWNlZGluZyBjYWxscyBjZWFzZS4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZC4KKiAtIEEgY29tbWFuZCBvdGhlciB0aGFuIENvbnRpbnVlLCBFbmFibGUsIERpc2FibGUsIENvbm5lY3Qgb3IgRGlzY29ubmVjdCBpcyBnaXZlbi4KKiAtIEFuIGludmFsaWQgY29tYmluYXRpb24gb2YgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbiBvciBhIGJpdCBvdXRzaWRlIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4uCiogLSBhbnkgcmV0dXJuIGNvZGUgYmVzaWRlcyBIQ0ZfU1VDQ0VTUy4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgYSBoY2ZfZnVuY3Rpb24gd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKKgltdWx0aS10aHJlYWRpbmcKKgoqLkRJQUdSQU0KKgloY2ZfY250bCB0YWtlcyBzdWNjZXNzaXZlbHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgoqMjoJSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlIFByaW1hcnkgb3IgU3RhdGlvbiBTdXBwbGllciBpbiB0aGUgSGVybWVzLAoqCWhjZl9jbnRsKCkgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIEhDRl9FUlJfTk9fTklDOz8gYXMgc3RhdHVzLgoqODoJd2hlbiB0aGUgcG9ydCBpcyBkaXNhYmxlZCwgdGhlIERNQSBlbmdpbmUgbmVlZHMgdG8gYmUgZGUtYWN0aXZhdGVkLCBzbyB0aGUgaG9zdCBjYW4gc2FmZWx5IHJlY2xhaW0gdHgKKglwYWNrZXRzIGZyb20gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4uCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKewppbnQJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9GVzsKI2lmIEhDRl9BU1NFUlQKewlpbnQgeCA9IGNtZCAmIEhDTURfQ01EX0NPREU7CglpZiAoIHggPT0gSENGX0NOVExfQ09OVElOVUUgKSB4ICY9IH5IQ01EX1JFVFJZOwoJZWxzZSBpZiAoICh4ID09IEhDTURfRElTQUJMRSB8fCB4ID09IEhDTURfRU5BQkxFKSAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgKSB7CgkJeCAmPSB+SEZTX1RYX0NOVExfUE9SVDsKCX0KCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8CgkJCSAgIHg9PUhDRl9DTlRMX0NPTk5FQ1QgfHwgeD09SENGX0NOVExfRElTQ09OTkVDVCwgY21kICkKfQojZW5kaWYgLy8gSENGX0FTU0VSVAovLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCi8vIAlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBjbWQgKQovLyAjZW5kaWYgLy8gSENGX0REUwoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTlRMLCBjbWQgKQoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsJCQkJCQkJCQkJCQkJCQkJIC8qMiovCi8qNiovCXJjID0gY21kX2V4ZSggaWZicCwgY21kLCAwICk7CiNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCQlpZmJwLT5JRkJfVGlja0NudCA9IDA7CQkJCS8vc3RhcnQgMiBzZWNvbmQgcGVyaW9kICh3aXRoIDEgdGljayB1bmNlcnRhbnR5KQojZW5kaWYgLy8gSENGX0REUwoJfQojaWYgSENGX0RNQQoJLy8hcmxhdiA6IG5vdGUgdGhhdCB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkLCByZWdhcmRsZXNzIG9mIHRoZSBERUZVTkNUIGJpdCBpbiBJRkJfQ2FyZFN0YXQuCgkvLyBUaGUgcmVhc29uIGJlaGluZCB0aGlzIGlzIHRoYXQgdGhlIE1TRiBzaG91bGQgYmUgYWJsZSB0byBnZXQgYWxsIGl0cyBETUEgcmVzb3VyY2VzIGJhY2sgZnJvbSB0aGUgSENGLAoJLy8gZXZlbiBpZiB0aGUgaGFyZHdhcmUgaXMgZGlzZnVuY3Rpb25hbC4gUHJhY3RpY2FsIGV4YW1wbGUgdW5kZXIgV2luZG93cyA6IHN1cnByaXNlIHJlbW92YWwuCglpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKCQloY2ZfaW8gaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2U7CgkJREVTQ19TVFJDVCAqcDsKCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9ESVNBQkxFIHx8IGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CgkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfRE1BX0NUUkwpLCBETUFfQ1RSTFNUQVRfUkVTRVQpOwkJCQkJCS8qOCovCgkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5ETUFfRU5BQkxFRDsKCQl9CgkJaWYgKCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgewoJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX0dPKTsKCQkJLyogOz8gYnkgcmV3cml0aW5nIGhjZl9kbWFfcnhfcHV0IHlvdSBjYW4gcHJvYmFibHkganVzdCBjYWxsIGhjZl9kbWFfcnhfcHV0KCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKQoJCQkgKiBhcyBhZGRpdGlvbmFsIGJlbmVmaWNpYXJ5IHNpZGUgZWZmZWN0LCB0aGUgU09QIGFuZCBFT1AgYml0cyB3aWxsIGFsc28gYmUgY2xlYXJlZAoJCQkgKi8KCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gRE1BX0VOQUJMRUQ7CgkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKQoJCQkvLyBtYWtlIHRoZSBlbnRpcmUgcnggZGVzY3JpcHRvciBjaGFpbiBETUEtb3duZWQsIHNvIHRoZSBETUEgZW5naW5lIGNhbiAocmUtKXVzZSBpdC4KCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKCQkJaWYgKHAgIT0gTlVMTCkgeyAgIC8vOz8gVGhpbmsgdGhpcyBvdmVyIGFnYWluIGluIHRoZSBsaWdodCBvZiB0aGUgbmV3IGNoYWluaW5nIHN0cmF0ZWd5CgkJCQlpZiAoIDEgKSAJeyAvL2JlZ2luIGFsdGVybmF0aXZlCgkJCQkJSENGQVNTRVJUKCBOVF9BU1NFUlQsIE5FVkVSX1RFU1RFRCApCgkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLCBETUFfUlggKTsKCQkJCQlpZiAoIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXSApIHsKCQkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLT5uZXh0X2Rlc2NfYWRkciwgRE1BX1JYICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQl3aGlsZSAoIHAgKSB7CgkJCQkJCS8vcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOwoJCQkJCQlwLT5CVUZfQ05UIHw9IERFU0NfRE1BX09XTkVEOwoJCQkJCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7CgkJCQkJfQoJCQkJCS8vIGEgcnggY2hhaW4gaXMgYXZhaWxhYmxlIHNvIGhhbmQgaXQgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQoJCQkJCXAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF07CgkJCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19SWERNQV9QVFIzMiksIHAtPmRlc2NfcGh5c19hZGRyKTsKCQkJCX0gIC8vZW5kIGFsdGVybmF0aXZlCgkJCX0KCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRE1BCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ05UTCApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX2NudGwKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCiouUFVSUE9TRQkJR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgoqCQkJCUluaXRpYWxpemVzIENhcmQgYW5kIEhDRiBob3VzZWtlZXBpbmcuCioKKi5BUkdVTUVOVFMKKglpZmJwCQkobmVhcikgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJaW9fYmFzZQkJbm9uLVVTQjogSS9PIEJhc2UgYWRkcmVzcyBvZiB0aGUgTklDIChjb25uZWN0KQoqCQkJCW5vbi1VU0I6IEhDRl9ESVNDT05ORUNUCioJCQkJVVNCOgkgSENGX0NPTk5FQ1QsIEhDRl9ESVNDT05ORUNUCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKglIQ0ZfRVJSX0lOQ09NUF9GVwoqCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCiohIQlIQ0ZfRVJSX05PX05JQyByZWFsbHkgcmV0dXJuZWQgOz8KKglIQ0ZfRVJSX05PX05JQwoqCUhDRl9FUlJfVElNRV9PVVQKKgoqCU1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6CioJSUZCX0lPQmFzZQkJCQllbnRyeSBwYXJhbWV0ZXIgaW9fYmFzZQoqCUlGQl9JT1JhbmdlCQkJCUhSRUdfSU9fUkFOR0UgKDB4NDAvMHg4MCkKKglJRkJfVmVyc2lvbgkJCQl2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0CioJSUZCX0ZXSWRlbnRpdHkJCQlDRkdfRldfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgaWRlbnRpdHkgb2YgdGhlCioJCQkJCQkJInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKglJRkJfRldTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgoqCQkJCQkJCXRoZSAicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucwoqCUlGQl9IU0lTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBIVy9TVyBJL0YgcmFuZ2Ugb2YgdGhlIE5JQwoqCUlGQl9QUklJZGVudGl0eQkJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSWRlbnRpdHkgb2YgdGhlIFByaW1hcnkgRi9XCioJSUZCX1BSSVN1cAkJCQlDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIHN1cHBsaWVyIHJhbmdlIG9mIHRoZSBQcmltYXJ5IEYvVwoqCWFsbCBvdGhlcgkJCQlhbGwgTVNGIGFjY2Vzc2libGUgZmllbGRzLCB3aGljaCBhcmUgbm90IHNwZWNpZmllZCBhYm92ZSwgYXJlIHplcm8tZmlsbGVkCioKKi5DT05ESVRJT05TCiogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gYXNzdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgSS9PIEJhc2UgYWRkcmVzcy4KKgoqIE5vdGU6IGhjZl9jb25uZWN0IGRlZmF1bHRzIHRvIE5JQyBpbnRlcnJ1cHQgZGlzYWJsZWQgbW9kZSwgaS5lLiBhcyBpZiBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX0lOVF9PRkYgKQoqIHdhcyBjYWxsZWQuCioKKi5ERVNDUklQVElPTgoqIGhjZl9jb25uZWN0IHBhc3NlcyB0aGUgTVNGLWRlZmluZWQgbG9jYXRpb24gb2YgdGhlIElGQiB0byB0aGUgSENGIGFuZCBncmFudHMgb3IgcmV2b2tlcyBhY2Nlc3MgcmlnaHQgZm9yIHRoZQoqIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKKiBpb19iYXNlLiAgRXZlcnkgY2FsbCBvZiBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIgbW9kZSwgbXVzdCBldmVudHVhbGx5IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCBvZiBoY2ZfY29ubmVjdAoqIGluICJkaXNjb25uZWN0IiBtb2RlLiBDbGFsbGluZyBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIvImRpc2Nvbm5lY3QiIG1vZGUgY2FuIG5vdCBiZSBuZXN0ZWQuCiogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKKiBhZGRyZXNzIGFzIGEgaGFuZGxlIHdoZW4gaXQgcGVyZm9ybXMgYSBjYWxsKGJhY2spIG9mIGFuIE1TRi1mdW5jdGlvbiAoaS5lLiBtc2ZfYXNzZXJ0KS4KKgoqIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCiogaW5mb3JtYXRpb24gaXMgcmUtaW5pdGlhbGl6ZWQuCiogVGhpcyBpbXBsaWVzIHRoYXQgYWxsIHNldHRpbmdzIHdoaWNoIGFyZSBkb25lIHZpYSBoY2ZfYWN0aW9uIGFuZCBoY2ZfcHV0X2luZm8gKGUuZy4gQ0ZHX01CX0FTU0VSVCwgQ0ZHX1JFR19NQiwKKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgoqCiogSWYgSENGX0lOVF9PTiBpcyBzZWxlY3RlZCBhcyBjb21waWxlIG9wdGlvbiwgTklDIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICggcmVmIGNoYXB0ZXIgSENGX0FMSUdOIGluIDQuMS4xKQoqIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KKgoqLkRJQUdSQU0KKgoqMDoJVGhyb3VnaG91dCBoY2ZfY29ubmVjdCB5b3UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGUgY29ubmVjdCBmcm9tIHRoZSBkaXNjb25uZWN0IGNhc2UsIHdoaWNoIHJlcXVpcmVzCioJc29tZSBhdHRlbnRpb24gYWJvdXQgd2hhdCB0byB1c2UgYXMgIkkvTyIgYWRkcmVzcyB3aGVuIGZvciB3aGljaCBwdXJwb3NlLgoqMjoKKjJhOiBSZXNldCBILUlJIGJ5IHRvZ2dsaW5nIHJlc2V0IGJpdCBpbiBJTy1yZWdpc3RlciBvbiBhbmQgb2ZmLgoqCVRoZSBIQ0ZfVFlQRV9QUkVMT0FERUQgY2F0ZXJzIGZvciB0aGUgRE9TIGVudmlyb25tZW50IHdoZXJlIEgtSUkgaXMgbG9hZGVkIGJ5IGEgc2VwYXJhdGUgcHJvZ3JhbSB0bwoqCW92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KKglUaGUgbWFjcm8gT1BXIGlzIG5vdCB5ZXQgdXNlYWJsZSBiZWNhdXNlIHRoZSBJRkJfSU9CYXNlIGZpZWxkIGlzIG5vdCBzZXQuCioJTm90ZSAxOiBob3BlZnVsbHkgdGhlIGNsZWFyaW5nIGFuZCBpbml0aWFsaXppbmcgb2YgdGhlIElGQiAoc2VlIGJlbG93KSBhY3RzIGFzIGEgZGVsYXkgd2hpY2ggbWVldHMgdGhlCioJc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0CioJTm90ZSAyOiBpdCB0dXJucyBvdXQgdGhhdCBvbiBzb21lIEgvVyBjb25zdGVsbGF0aW9ucywgdGhlIGNsb2NrIHRvIGFjY2VzcyB0aGUgRUVQcm9tIGlzIG5vdCBsb3dlcmVkCioJdG8gYW4gYXBwcm9wcmlhdGUgZnJlcXVlbmN5IGJ5IEhSRUdfSU9fU1JFU0VULiBCeSBnaXZpbmcgYW4gSENNRF9JTkkgZmlyc3QsIHRoaXMgcHJvYmxlbSBpcyB3b3JrZWQgYXJvdW5kLgoqMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCioJRXYgcmVnaXN0ZXIgZ2l2ZXMgYSB3b3JrYWJsZSBzdHJhdGVneS4gVGhlIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGdpdmUgbXVjaCBjbHVlcy4KKjQ6CWNsZWFyIGFuZCBpbml0aWFsaXplIHRoZSBJRkIKKglUaGUgSENGIGhvdXNlIGtlZXBpbmcgaW5mbyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgemVybyBpcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB2YWx1ZSBmb3IgYXMgbXVjaCBhcwoqCWZlYXNpYmxlIElGQi1pdGVtcy4KKglUaGUgcmVhZGFibGUgZmllbGRzIG1lbnRpb25lZCBpbiB0aGUgZGVzY3JpcHRpb24gc2VjdGlvbiBhbmQgc29tZSBIQ0Ygc3BlY2lmaWMgZmllbGRzIGFyZSBnaXZlbiB0aGVpcgoqCWFjdHVhbCB2YWx1ZS4KKglJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBiZXN0IGd1ZXNzIGJlZm9yZSBjYWxpYnJhdGlvbgoqCUhjZl9jb25uZWN0IGRlZmF1bHRzIHRvICJubyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiIgKGltcGxpY2l0bHkgYWNoaWV2ZWQgYnkgdGhlIHplcm8tZmlsbGluZykuCio2OglSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKKgljYXN0IG5lZWRlZCB0byBnZXQgYXJvdW5kIHRoZSAibmVhciIgcHJvYmxlbSBpbiBET1MgQ09NIG1vZGVsCioJZXIgQzI0NDY6IG5vIGNvbnZlcnNpb24gZnJvbSB2b2lkIChfX25lYXIgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKgkJCQkJCQl0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQoqODoJSWYgYSBjb21tYW5kIGlzIGFwcGFyZW50bHkgc3RpbGwgYWN0aXZlIChhcyBpbmRpY2F0ZWQgYnkgdGhlIEJ1c3kgYml0IGluIENtZCByZWdpc3RlcikgdGhpcyBtYXkgaW5kaWNhdGUgYQoqCWJsb2NrZWQgY21kIHBpcGUgbGluZS4gIFRvIHVuYmxvY2sgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBkb25lOgoqCSAtIEFjayBldmVyeXRoaW5nCioJIC0gV2FpdCBmb3IgQnVzeSBiaXQgZHJvcCAgaW4gQ21kIHJlZ2lzdGVyCioJIC0gV2FpdCBmb3IgQ21kICBiaXQgcmFpc2UgaW4gRXYgIHJlZ2lzdGVyCioJVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cwoqCWZhaWwgKHByb3RfY250IGJlY29tZXMgMCksIHRoZW4gc29tZXRoaW5nIGlzIHNlcmlvdXMgd3JvbmcuIFJhdGhlciB0aGFuIFBBTklDSywgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUKKgluZXh0IGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIHRoZSBIQ0YgdG8gZ28gaW50byBERUZVTkNUIG1vZGUKKjEwOglBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5IGJsb2NrZWQpIGNtZCBwaXBlIGxpbmUKKglOb3RlIDE6IGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSAoU2VuZCkgQ21kIGV2ZW50IGlzCioJcGVuZGluZyBvbiBub24taW5pdGlhbCBjYWxscwoqCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KKglIZXJtZXMgSW5pdGlhbGl6ZQoqMTI6CU9ubHkgSC1JSSBORUVEUyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRHVlIHRvIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciBILUkgYW5kIEgtSUkKKglJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCioJSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRXhlY3V0aW5nIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kIGZvciBILUkgd291bGQgbm90IGhhcm0gYnV0IG5vdCBkbwoqCWFueXRoaW5nIHVzZWZ1bCBlaXRoZXIsIHNvIGl0IGlzIHNraXBwZWQuCioJVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KKjE0Ogl1c2UgaW9fYmFzZSBhcyBhIGZsYWcgdG8gbWVyZ2UgaGNmX2Nvbm5lY3QgYW5kIGhjZl9kaXNjb25uZWN0IGludG8gMSByb3V0aW5lCioJdGhlIGNhbGwgdG8gaW5pdCBhbmQgaXRzIHN1YnNlcXVlbnQgY2FsbCBvZiBjbWRfZXhlIHdpbGwgcmV0dXJuIEhDRl9FUlJfTk9fTklDIGlmIGFwcHJvcHJpYXRlLiBUaGlzIHN0YXR1cwoqCWlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KKgl0aW1lLgoqCiouTk9USUNFCioJT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBOVUxMLXBvaW50ZXIgaXMgbm90IGEgYml0LXBhdHRlcm4gb2YgYWxsIHplcm9zLCB0aGUgemVyby1maWxsaW5nIG9mIHRoZSBJRkIgcmVzdWx0cwoqCWluIGFuIGluY29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiBwb2ludGVycy4KKglUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94CioJYmFzZWQgb24gSUZCX01CU2l6ZSwgSUZCX01CV3AgYW5kIGlmYnAtPklGQl9NQlJwLiBUaGlzIGhhcyByYW1pZmljYXRpb25zIG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKglNYWlsQm94IHZpYSBoY2ZfcHV0X2luZm8gd2l0aCB0aGUgQ0ZHX1JFR19NQiB0eXBlLCBidXQgaXQgcHJldmVudHMgZGVwZW5kZW5jeSBvbiB0aGUgIk5VTEwtIm5lc3Mgb2YKKglJRkJfTUJwLgoqCiouTk9USUNFCioJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoZW4gYXNzZXJ0aW5nIGFuZCBsb2dnaW5nIGhjZl9jb25uZWN0LCBlLmcuCioJIC0gQXNzZXJ0aW5nIG9uIHJlLWVudHJhbmN5IG9mIGhjZl9jb25uZWN0IGJ5IG1lYW5zIG9mCioJICJIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiBIQ0ZfQVNTRVJUX0NPTk5FQ1QpID09IDAsIDAgKSIgaXMgbm90IHVzZWZ1bCBiZWNhdXNlIElGQiBjb250ZW50cwoqCSBhcmUgdW5kZWZpbmVkCioJIC0gQXNzZXJ0aW5nIGJlZm9yZSB0aGUgSUZCIGlzIGNsZWFyZWQgd2lsbCBjYXVzZSBtZGRfYXNzZXJ0KCkgdG8gaW50ZXJwcmV0IHRoZSBnYXJiYWdlIGluIElGQl9Bc3NlcnRSdG4KKgkgYXMgYSByb3V0aW5lIGFkZHJlc3MKKglUaGVyZWZvcmUgSENGVFJBQ0Ugbm9yIEhDRkxPR0VOVFJZIGlzIGNhbGxlZCBieSBoY2ZfY29ubmVjdC4KKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCnsKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmX2lvCQlpb19hZGRyOwpoY2ZfMzIJCXByb3RfY250OwpoY2ZfOAkJKnE7CkxUVl9TVFJDVAl4OwojaWYgSENGX0FTU0VSVAoJaGNmXzE2IHhhID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwOwoJLyogaXMgYXNzdW1lZCB0byBjYXVzZSBhbiBhc3NlcnQgbGF0ZXIgb24gaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCgkgKiB4YSA9PSBDRkdfRldfSURFTlRJVFkgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRob3V0IHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKCSAqIHhhID09IDAgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRoIHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKCSAqIHhhID09ICJnYXJiYWdlIiAoYW55IHZhbHVlIGV4Y2VwdCBDRkdfRldfSURFTlRJVFkgaXMgYWNjZXB0YWJsZSkgaW4gdGhlIGluaXRpYWwgY2FsbAoJICovCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgewkJCQkJLy9kaXNjb25uZWN0CgkJaW9fYWRkciA9IGlmYnAtPklGQl9JT0Jhc2U7CgkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwkJLy87P3dvcmthcm91bmQgYWdhaW5zdCBkeWluZyBGL1cgb24gc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBjYWxscwoJfSBlbHNlIHsJCQkJCQkJCQkJCS8vY29ubmVjdAkJCQkJCQkJLyogMCAqLwoJCWlvX2FkZHIgPSBpb19iYXNlOwoJfQoKI2lmIDAgLy87PyBpZiBhIHN1YnNlcXVlbnQgaGNmX2Nvbm5lY3QgaXMgcHJlY2VlZGVkIGJ5IGFuIGhjZl9kaXNjb25uZWN0IHRoZSB3YWtldXAgaXMgbm90IG5lZWRlZCAhIQojaWYgSENGX1NMRUVQCiAgICBPVVRfUE9SVF9XT1JEKCAuLi4uLitIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOyAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQoJTVNGX1dBSVQoODAwKTsJCQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCglub3RlIHRoYXQgTVNGX1dBSVQgdXNlcyBub3QgeWV0IGRlZmluZWQhISEhIElGQl9JT0Jhc2UgYW5kIElGQl9UaWNrSW5pICh2aWEgUFJPVF9DTlRfSU5JKQoJc28gYmUgY2FyZWZ1bGwgaWYgdGhpcyBjb2RlIGlzIHJlc3RvcmVkCiNlbmRpZiAvLyBIQ0ZfU0xFRVAKI2VuZGlmIC8vIDAKCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCS8vc3dpdGNoIGNsb2NrIGJhY2sgZm9yIFNFRVBST00gYWNjZXNzICAhISEKCU9VVF9QT1JUX1dPUkQoIGlvX2FkZHIgKyBIUkVHX0NNRCwgSENNRF9JTkkgKTsgIAkgICAgLy9PUFcgbm90IHlldCB1c2VhYmxlCglwcm90X2NudCA9IElOSV9USUNLX0lOSTsKCUhDRl9XQUlUX1dISUxFKCAoSU5fUE9SVF9XT1JEKCBpb19hZGRyICsgIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwoJT1VUX1BPUlRfV09SRCggKGlvX2FkZHIgKyBIUkVHX0lPKSwgSFJFR19JT19TUkVTRVQgKTsJLy9PUFcgbm90IHlldCB1c2VhYmxlCQkJCQkvKiAyYSovCiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKCWZvciAoIHEgPSAoaGNmXzgqKSgmaWZicC0+SUZCX01hZ2ljKTsgcSA+IChoY2ZfOCopaWZicDsgKi0tcSA9IDAgKSAvKk5PUCovOwkJCQkJCS8qIDQgKi8KCWlmYnAtPklGQl9NYWdpYwkJPSBIQ0ZfTUFHSUM7CglpZmJwLT5JRkJfVmVyc2lvbgk9IElGQl9WRVJTSU9OOwojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIC8vYSBuZXcgSUZCIGRlbW9uc3RyYXRlcyBob3cgZGlydHkgdGhlIHNvbHV0aW9uIGlzCgl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSBOVUxMOwkJLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIJMHhGRDAyCgl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9IE5VTEw7CS8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlcgkJMHhGRDAzCiNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECiNpZiAoSENGX1RBTExJRVMpICYgKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQoJaWZicC0+SUZCX1RhbGx5TGVuID0gMSArIDIgKiAoSENGX05JQ19UQUxfQ05UICsgSENGX0hDRl9UQUxfQ05UKTsJLy9jb252ZXJ0ICMgb2YgVGFsbGllcyB0byBMIHZhbHVlIGZvciBMVFYKCWlmYnAtPklGQl9UYWxseVR5cCA9IENGR19UQUxMSUVTOwkJCS8vSUZCX1RhbGx5VHlwOiBzZXQgVCB2YWx1ZQojZW5kaWYgLy8gSENGX1RBTExJRVNfTklDIC8gSENGX1RBTExJRVNfSENGCglpZmJwLT5JRkJfSU9CYXNlCT0gaW9fYWRkcjsJCQkJLy9zZXQgSU9fQmFzZSBhc2FwLCBzbyBhc3NlcnRzIHZpYSBIUkVHX1NXXzIgZG9uJ3QgaGFybQoJaWZicC0+SUZCX0lPUmFuZ2UJPSBIUkVHX0lPX1JBTkdFOwoJaWZicC0+SUZCX0NudGxPcHQJPSBVU0VfMTZCSVQ7CiNpZiBIQ0ZfQVNTRVJUCglhc3NlcnRfaWZicCA9IGlmYnA7CglpZmJwLT5JRkJfQXNzZXJ0THZsID0gMTsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KCWlmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKCQlpZmJwLT5JRkJfQXNzZXJ0UnRuID0gKE1TRl9BU1NFUlRfUlROUCltc2ZfYXNzZXJ0OwkJCQkJCQkJCQkJLyogNiAqLwoJfQojZW5kaWYgLy8gSENGX0FTU0VSVF9MTktfTVNGX1JUTgojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgkJCQkvL2J1aWxkIHRoZSBzdHJ1Y3R1cmUgdG8gcGFzcyB0aGUgYXNzZXJ0IGluZm8gdG8gaGNmX3B1dF9pbmZvCglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QubGVuID0gc2l6ZW9mKGlmYnAtPklGQl9Bc3NlcnRTdHJjdCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LnR5cCA9IENGR19NQl9JTkZPOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmJhc2VfdHlwID0gQ0ZHX01CX0FTU0VSVDsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2NudCA9IDE7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19sZW4gPQoJCSggb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfQXNzZXJ0THZsKSAtIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydExpbmUpICkgLyBzaXplb2YoaGNmXzE2KTsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAmaWZicC0+SUZCX0Fzc2VydExpbmU7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX01CCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCglJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7ICkKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAoJT1BXKCBIUkVHX0lPLCAweDAwMDAgKTsJCQkJCQkvL09QVyB1c2VhYmxlCQkJCQkJCQkJCS8qIDJiKi8KCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKQoJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ICkgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsgKQojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECgkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKQkpIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKCUhDRkFTU0VSVCggeGEgIT0gQ0ZHX0ZXX0lERU5USVRZLCAwICkJCS8vIGFzc2VydCBpZiBoY2ZfY29ubmVjdCBpcyBjYWxsZWQgd2l0aG91dCBpbnRlcnZlbmluZyBoY2ZfZGlzY29ubmVjdC4KCUhDRkFTU0VSVCggKChoY2ZfMzIpKHZvaWQqKWlmYnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMikodm9pZCopaWZicCApCglIQ0ZBU1NFUlQoIChpb19hZGRyICYgMHgwMDNGKSA9PSAwLCBpb19hZGRyICkKCQkJCQkJCQkJCQkJLy9pZiBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIKCWlmIChJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSB7CQkJCQkJCQkJCQkJCQkJCS8qIDggKi8KCQkJCQkJCQkJCQkJLy8uICBBY2sgYWxsIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQoJCU9QVyggSFJFR19FVl9BQ0ssIH5IUkVHX0VWX1NMRUVQX1JFUSApOwoJCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgoJCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgoJCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApICYmIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwoJCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKSAvKiBpZiBwcm90X2NudCA9PSAwLCBjbWRfZXhlIHdpbGwgZmFpbCwgY2F1c2luZyBERUZVTkNUICovCgl9CglPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAJCQkJCQkJCQkJCQkJCS8qMTIqLwoJKHZvaWQpY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAppZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CgkJcmMgPSBpbml0KCBpZmJwICk7CQkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLwoJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCXgubGVuID0gMjsKCQkJeC50eXAgPSBDRkdfTklDX0JVU19UWVBFOwoJCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsICZ4ICk7CgkJCWlmYnAtPklGQl9CdXNUeXBlID0geC52YWxbMF07CgkJCS8vQ0ZHX05JQ19CVVNfVFlQRSBub3Qgc3VwcG9ydGVkIC0+IGRlZmF1bHQgMzIgYml0cy9ETUEsIE1TRiBoYXMgdG8gb3ZlcnJ1bGUgdmlhIENGR19DTlRMX09QVAoJCQlpZiAoIHgubGVuID09IDAgfHwgeC52YWxbMF0gPT0gMHgwMDAyIHx8IHgudmFsWzBdID09IDB4MDAwMyApIHsKI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUwoJCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV8xNkJJVDsJCQkvL3Jlc2V0IFVTRV8xNkJJVAojZW5kaWYgLy8gSENGX0lPXzMyQklUUwojaWYgSENGX0RNQQoJCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gVVNFX0RNQTsJCQkJLy9TRVQgRE1BCiNlbHNlCgkJCQlpZmJwLT5JRkJfSU9SYW5nZSA9IDB4NDAgLyppLnMuby4gSFJFR19JT19SQU5HRSovOwojZW5kaWYgLy8gSENGX0RNQQoJCQl9CgkJfQoJfSBlbHNlIEhDRkFTU0VSVCggICggaWZicC0+SUZCX01hZ2ljIF49IEhDRl9NQUdJQyApID09IDAsIGlmYnAtPklGQl9NYWdpYyApIC8qTk9QKi87CgkvKiBvZiBhYm92ZSBIQ0ZBU1NFUlQgb25seSB0aGUgc2lkZSBlZmZlY3QgaXMgbmVlZGVkLCBOT1AgaW4gY2FzZSBIQ0ZBU1NFUlQgaXMgZHVtbXkgKi8KCWlmYnAtPklGQl9JT0Jhc2UgPSBpb19iYXNlOwkJCQkJCQkJCQkJCQkJCQkJCS8qIDAqLwoJcmV0dXJuIHJjOwp9IC8vIGhjZl9jb25uZWN0CgojaWYgSENGX0RNQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogRnVuY3Rpb24gZ2V0X2ZyYW1lX2xzdAoqICAtIHJlc29sdmUgdGhlICJsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciIgcHJvYmxlbXMgd2hlbiBhIGRlc2NyaXB0b3IgbGlzdCBpcyByZWNsYWltZWQgYnkgdGhlIE1TRi4KKgoqIFRoZSBGcmFtZUxpc3QgdG8gYmUgcmVjbGFpbWVkIGFzIHdlbGwgYXMgdGhlIERlc2NyaXB0b3JMaXN0IGFsd2F5cyBzdGFydCBpbiBJRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddCiogYW5kIHRoaXMgaXMgYWx3YXlzIHRoZSAiY3VycmVudCIgREVMV0EgRGVzY3JpcHRvci4KKgoqIElmIGEgRnJhbWVMaXN0IGlzIGF2YWlsYWJsZSwgdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IHRvIHR1cm5lZCBpbnRvIGEgbmV3IERFTFdBIERlc2NyaXB0b3I6CiogIC0gYSBjb3B5IGlzIG1hZGUgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IGludG8gdGhlIGN1cnJlbnQKKgkgREVMV0EgRGVzY3JpcHRvcgoqICAtIHRoZSByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGlzIGRldGFjaGVkIGZyb20gdGhlIGNvcHkgYnkgc2V0dGluZyB0aGUgbmV4dF9kZXNjX2FkZHIgYXQgTlVMTAoqICAtIHRoZSBETUEgY29udHJvbCBiaXRzIG9mIHRoZSBjb3B5IGFyZSBjbGVhcmVkIHRvIGRvIG5vdCBjb25mdXNlIHRoZSBNU0YKKiAgLSB0aGUgY29weSBvZiB0aGUgbGFzdCBkZXNjcmlwdG9yIChpLmUuIHRoZSAib2xkIiBERUxXQSBEZXNjcmlwdG9yKSBpcyBjaGFpbmVkIHRvIHRoZSBwcmV2IERlc2NyaXB0b3IKKgkgb2YgdGhlIEZyYW1lTGlzdCwgdGh1cyByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGxhc3QgRGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LgoqICAtIElGQl9GaXJzdERlc2MgaXMgY2hhbmdlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGF0IHJlcGxhY2VkIChvcmlnaW5hbCkgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QsCioJIGkuZS4gdGhlICJuZXciIERFTFdBIERlc2NyaXB0b3IuCioKKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgY29weSBvZiB0aGF0IGxhc3QgaG9zdC1vd25lZCBkZXNjcmlwdG9yLCBzbyB0aGUgTVNGIHdpbGwgZ2V0IGEgY29weSBvZiB0aGUgZGVzY3JpcHRvci4KKiBPbiB0b3Agb2YgdGhhdCwgaXQgYWRqdXN0cyBETUEgcmVsYXRlZCBmaWVsZHMgaW4gdGhlIElGQiBzdHJ1Y3R1cmUuCgkvLyBwZXJmb3JtIGEgY29weWluZy1zY2hlbWUgdG8gY2lyY3VtdmVudCB0aGUgJ2xhc3QgaG9zdCBvd25lZCBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZWNsYWltZWQnIGxpbWl0YXRpb24gaW1wb3NlZCBieSBIMi41J3MgRE1BIGhhcmR3YXJlIGRlc2lnbgoJLy8gYSAncmVjbGFpbSBkZXNjcmlwdG9yJyBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBIQ0Y6CioKKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKgogODogQmUgY2FyZWZ1bCBvbmNlIHlvdSBzdGFydCByZS1vcmRlcmluZyB0aGUgc3RlcHMgaW4gdGhlIGNvcHkgcHJvY2VzcywgdGhhdCBpdCBzdGlsbCB3b3JrcyBmb3IgY2FzZXMKKiAJb2YgRnJhbWVMaXN0cyBvZiAxLCAyIGFuZCBtb3JlIHRoYW4gMiBkZXNjcmlwdG9ycwoqCiogSW5wdXQgcGFyYW1ldGVyczoKKiB0eF9yeF9mbGFnICAgICAgOiBzcGVjaWZpZXMgJ3RyYW5zbWl0JyBvciAncmVjZWl2ZScgZGVzY3JpcHRvci4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgREVTQ19TVFJDVCoKZ2V0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyApCnsKCkRFU0NfU1RSQ1QgKmhlYWQgPSBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddOwpERVNDX1NUUkNUICpjb3B5LCAqcCwgKnByZXY7CgoJSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCgkJCQkJCQkJLy9pZiBGcmFtZUxpc3QKCWlmICggaGVhZCApIHsKCQkJCQkJCQkvLy4gIHNlYXJjaCBmb3IgbGFzdCBkZXNjcmlwdG9yIG9mIGZpcnN0IEZyYW1lTGlzdAoJCXAgPSBwcmV2ID0gaGVhZDsKCQl3aGlsZSAoICggcC0+QlVGX1NJWkUgJiBERVNDX0VPUCApID09IDAgJiYgcC0+bmV4dF9kZXNjX2FkZHIgKSB7CgkJCWlmICggKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgPT0gMCApIHsJLy9jbGVhciBjb250cm9sIGJpdHMgd2hlbiBkaXNhYmxlZAoJCQkJcC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOwoJCQl9CgkJCXByZXYgPSBwOwoJCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7CgkJfQoJCQkJCQkJCS8vLiAgaWYgRE1BIGVuYWJsZWQKCQlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgRE1BX0VOQUJMRUQgKSB7CgkJCQkJCQkJLy8uICAuICBpZiBsYXN0IGRlc2NyaXB0b3Igb2YgRnJhbWVMaXN0IGlzIERNQSBvd25lZAoJCQkJCQkJCS8vLiAgLiAgb3IgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IKCQkJaWYgKCBwLT5CVUZfQ05UICYgREVTQ19ETUFfT1dORUQgfHwgaGVhZC0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCApIHsKCQkJCQkJCQkvLy4gIC4gIC4gIHJlZnVzZSB0byByZXR1cm4gRnJhbWVMaXN0IHRvIGNhbGxlcgoJCQkJaGVhZCA9IE5VTEw7CgkJCX0KCQl9Cgl9CgkJCQkJCQkJLy9pZiByZXR1cm5hYmxlIEZyYW1lTGlzdCBmb3VuZAoJaWYgKCBoZWFkICkgewoJCQkJCQkJCS8vLiAgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IgKGltcGxpZXMgRE1BIGRpc2FibGVkKQogCQlpZiAoIGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CgkJCQkJCQkJLy8uICAuICBjbGVhciBEZXNjcmlwdG9yTGlzdAoJCQkvKjs/aWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0qLyBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gTlVMTDsKCQkJCQkJCQkvLy4gIGVsc2UKCQl9IGVsc2UgewoJCQkJCQkJCS8vLiAgLiAgc3RyaXAgaGFyZHdhcmUtcmVsYXRlZCBiaXRzIGZyb20gbGFzdCBkZXNjcmlwdG9yCgkJCQkJCQkJLy8uICAuICByZW1vdmUgREVMV0EgRGVzY3JpcHRvciBmcm9tIGhlYWQgb2YgRGVzY3JpcHRvckxpc3QKCQkJY29weSA9IGhlYWQ7CgkgCQloZWFkID0gaGVhZC0+bmV4dF9kZXNjX2FkZHI7CgkJCQkJCQkJLy8uICAgLiAgZXhjaGFuZ2UgZmlyc3QgKENvbmZpbmVkKSBhbmQgbGFzdCAocG9zc2libHkgaW1wcmlzb25lZCkgRGVzY3JpcHRvcgoJCQljb3B5LT5idWZfcGh5c19hZGRyID0gcC0+YnVmX3BoeXNfYWRkcjsKCQkJY29weS0+YnVmX2FkZHIgPSBwLT5idWZfYWRkcjsKCQkJY29weS0+QlVGX1NJWkUgPSBwLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwkvL2dldCByaWQgb2YgREVTQ19FT1AgYW5kIHBvc3NpYmx5IERFU0NfU09QCgkJCWNvcHktPkJVRl9DTlQgPSBwLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7CS8vZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAojaWYgKEhDRl9FWFQpICYgSENGX0RFU0NfU1RSQ1RfRVhUCgkJCWNvcHktPkRFU0NfTVNGU3VwID0gcC0+REVTQ19NU0ZTdXA7CiNlbmRpZiAvLyBIQ0ZfREVTQ19TVFJDVF9FWFQKCQkJCQkJCQkvLy4gIC4gIHR1cm4gaW50byBhIERFTFdBIERlc2NyaXB0b3IKCQkJcC0+YnVmX2FkZHIgPSBOVUxMOwoJCQkJCQkJCS8vLiAgLiAgY2hhaW4gY29weSB0byBwcmV2CQkJCQkJCQkJCQkvKiA4Ki8KCQkJcHJldi0+bmV4dF9kZXNjX2FkZHIgPSBjb3B5OwoJCQkJCQkJCS8vLiAgLiAgZGV0YWNoIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgZnJvbSBGcmFtZUxpc3QKCQkJY29weS0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwoJCQljb3B5LT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKCQkJCQkJCQkvLy4gIC4gIHNhdmUgdGhlIG5ldyBzdGFydCAoaS5lLiBERUxXQSBEZXNjcmlwdG9yKSBpbiBJRkJfRmlyc3REZXNjCgkJCWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBwOwoJCX0KCQkJCQkJCQkvLy4gIHN0cmlwIERFU0NfU09QIGZyb20gZmlyc3QgZGVzY3JpcHRvcgoJCWhlYWQtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CgkJLy9oZWFkLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7ICBnZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECgkJaGVhZC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCgl9CgkJCQkJCQkJLy9yZXR1cm4gdGhlIGp1c3QgZGV0YWNoZWQgRnJhbWVMaXN0IChpZiBhbnkpCglyZXR1cm4gaGVhZDsKfSAvLyBnZXRfZnJhbWVfbHN0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEZ1bmN0aW9uIHB1dF9mcmFtZV9sc3QKKgoqIFRoaXMgZnVuY3Rpb24KKgoqIFJldHVybnM6IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdAoqCiogSW5wdXQgcGFyYW1ldGVyczoKKiB0eF9yeF9mbGFnICAgICAgOiBzcGVjaWZpZXMgJ3RyYW5zbWl0JyBvciAncmVjZWl2ZScgZGVzY3JpcHRvci4KKgoqIFRoZSBmb2xsb3dpbmcgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggaGNmX2RtYV90eC9yeF9wdXQsIGluIG9yZGVyIHRvIGdldCB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCiogQXNzZXJ0IGZhaWxzIGlmCiogLQlETUEgaXMgbm90IGVuYWJsZWQKKiAtCWRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCiogLQlhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoqIC0JYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCiogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKiAtCXRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAoqIC0JYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCiogLQlQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCgoqLk5PVElDRQoqIFRoZSBhc3NlcnRzIG1hcmtlZCB3aXRoICpzYyogYXJlIHJlYWxseSBzYW5pdHkgY2hlY2tzIGZvciB0aGUgSENGLCB0aGV5IGNhbiAoc3VwcG9zZWRseSkgbm90IGJlIGluZmx1ZW5jZWQKKiBieSBpbmNvcnJlY3QgTVNGIGJlaGF2aW9yCgoJCS8vIFRoZSBNU0YgaXMgcmVxdWlyZWQgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBhIHNpbmdsZSBkZXNjcmlwdG9yIGZvciBNU0YgdHggcmVjbGFpbSBwdXJwb3Nlcy4KCQkvLyBUaGlzICdyZWNsYWltIGRlc2NyaXB0b3InIGNhbiBiZSByZWNvZ25pemVkIGJ5IHRoZSBmYWN0IHRoYXQgaXRzIGJ1Zl9hZGRyIGZpZWxkIGlzIHplcm8uCgkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCSogQWx0aG91Z2ggbm90IHJlcXVpcmVkIGZyb20gYSBoYXJkd2FyZSBwZXJzcGVjdGl2ZToKCSogLSBtYWtlIGVhY2ggZGVzY3JpcHRvciBpbiB0aGlzIHJ4LWNoYWluIERNQS1vd25lZC4KCSogLSBBbHNvIHNldCB0aGUgY291bnQgdG8gemVyby4gRU9QIGFuZCBTT1AgYml0cyBhcmUgYWxzbyBjbGVhcmVkLgoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKQp7CglERVNDX1NUUkNUCSpwID0gZGVzY3A7CgloY2ZfMTYgcG9ydDsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSwgaWZicC0+SUZCX0NudGxPcHQpIC8vb25seSBoY2ZfZG1hX3R4X3B1dCBtdXN0IGFsc28gYmUgRE1BX0VOQUJMRUQKCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQoJSENGQVNTRVJUKCBwICwgMCApCgoJd2hpbGUgKCBwICkgewoJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQoJCUhDRkFTU0VSVCggKHAtPkJVRl9DTlQgJiB+REVTQ19DTlRfTUFTSykgPT0gMCwgcC0+QlVGX0NOVCApCgkJSENGQVNTRVJUKCAocC0+QlVGX1NJWkUgJiB+REVTQ19DTlRfTUFTSykgPT0gMCwgcC0+QlVGX1NJWkUgKQoJCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CQkJCQkvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgoJCXAtPkJVRl9DTlQgJj0gdHhfcnhfZmxhZyA9PSBETUFfUlggPyAwIDogREVTQ19DTlRfTUFTSzsJLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKCQlwLT5CVUZfQ05UIHw9IERFU0NfRE1BX09XTkVEOwoJCWlmICggcC0+bmV4dF9kZXNjX2FkZHIgKSB7Ci8vCQkJSENGQVNTRVJUKCBwLT5idWZfYWRkciAmJiBwLT5idWZfcGh5c19hZGRyICAmJiBwLT5CVUZfU0laRSAmJiArLy0gcC0+QlVGX1NJWkUsIC4uLiApCgkJCUhDRkFTU0VSVCggcC0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyLCAoaGNmXzMyKXAtPm5leHRfZGVzY19hZGRyICkKCQkJcC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkcjsKCQl9IGVsc2UgewkJCQkJCQkJCS8vCgkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSAwOwoJCQlpZiAoIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CQkJLy8gREVMV0EgRGVzY3JpcHRvcgoJCQkJSENGQVNTRVJUKCBkZXNjcCA9PSBwLCAoaGNmXzMyKWRlc2NwICkJLy9zaW5nbGV0b24gRGVzY3JpcHRvckxpc3QKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10pCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSkKCQkJCWRlc2NwLT5CVUZfQ05UID0gMDsgLy8mPSB+REVTQ19ETUFfT1dORUQ7CgkJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gZGVzY3A7Ci8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOwoJCQkJCQkJCQkJCQkJLy8gaWYgInJlY3ljbGluZyIgYSBGcmFtZUxpc3QKCQkJCQkJCQkJCQkJCS8vIChlLmcuIGNhbGxlZCBmcm9tIGhjZl9jbnRsKCBIQ0ZfQ05UTF9FTkFCTEUgKQoJCQkJCQkJCQkJCQkJLy8gLiAgcHJlcGFyZSBmb3IgYWN0aXZhdGlvbiBETUEgY29udHJvbGxlcgovLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGRlc2NwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOwoJCQl9IGVsc2UgewkJCQkJCQkJLy9hICJyZWFsIiBGcmFtZUxpc3QsIGhhbmQgaXQgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddLCAoaGNmXzMyKWRlc2NwICkKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLCAoaGNmXzMyKWRlc2NwICkKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMLAoJCQkJCQkgICAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIpCi8vCQkJCXAtPmJ1Zl9jbnRsLmNudGxfc3RhdCB8PSBERVNDX0RNQV9PV05FRDsKCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPSBkZXNjcDsKCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IGRlc2NwLT5kZXNjX3BoeXNfYWRkcjsKCQkJCXBvcnQgPSBIUkVHX1JYRE1BX1BUUjMyOwoJCQkJaWYgKCB0eF9yeF9mbGFnICkgewoJCQkJCXAtPkJVRl9TSVpFIHw9IERFU0NfRU9QOwkvLyBwIHBvaW50cyBhdCB0aGUgbGFzdCBkZXNjcmlwdG9yIGluIHRoZSBjYWxsZXItc3VwcGxpZWQgZGVzY3JpcHRvciBjaGFpbgoJCQkJCWRlc2NwLT5CVUZfU0laRSB8PSBERVNDX1NPUDsKCQkJCQlwb3J0ID0gSFJFR19UWERNQV9QVFIzMjsKCQkJCX0KCQkJCU9VVF9QT1JUX0RXT1JEKCAoaWZicC0+SUZCX0lPQmFzZSArIHBvcnQpLCBkZXNjcC0+ZGVzY19waHlzX2FkZHIgKTsKCQkJfQoJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPSBwOwoJCX0KCQlwID0gcC0+bmV4dF9kZXNjX2FkZHI7Cgl9Cn0gLy8gcHV0X2ZyYW1lX2xzdAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV9yeF9nZXQoIElGQlAgaWZicCApCiouUFVSUE9TRQkJZGVjYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBwcm92aWRlcyB0aGF0IG1lc3NhZ2UgdG8gdGhlIE1TRi4KKgkJCQlyZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwoqCXBvaW50ZXIgdG8gYSBGcmFtZUxpc3QKKgoqLkRFU0NSSVBUSU9OCiogaGNmX2RtYV9yeF9nZXQgaXMgaW50ZW5kZWQgdG8gIHJldHVybiBhIHJlY2VpdmVkIGZyYW1lIHdoZW4gc3VjaCBhIGZyYW1lIGlzIGRlcG9zaXRlZCBpbiBIb3N0IG1lbW9yeSBieSB0aGUKKiBETUEgZW5naW5lLiBJbiBhZGRpdGlvbiBoY2ZfZG1hX3J4X2dldCBjYW4gYmUgdXNlZCB0byByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbgoqIHdoZW4gdGhlIERNQSBFbmdpbmUgaXMgZGlzYWJsZWQsIGUuZy4gYXMgcGFydCBvZiBhIGRyaXZlciB1bmxvYWRpbmcgc3RyYXRlZ3kuCiogaGNmX2RtYV9yeF9nZXQgbXVzdCBiZSBjYWxsZWQgcmVwZWF0ZWRseSBieSB0aGUgTVNGIHdoZW4gaGNmX3NlcnZpY2VfbmljIHNpZ25hbHMgYXZhaWxhYmlsaXR5IG9mIGEgcnggZnJhbWUKKiB0aHJvdWdoIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgb2YgSUZCX0RtYVBhY2tldHMuIFRoZSBjYWxsaW5nIG11c3Qgc3RvcCB3aGVuIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLCBhdAoqIHdoaWNoIHRpbWUgdGhlIEhSRUdfRVZfUkRNQUQgZmxhZyBpcyBhbHNvIGNsZWFyZWQgYnkgdGhlIEhDRiB0byBhcm0gdGhlIG1lY2hhbmlzbSBmb3IgdGhlIG5leHQgZnJhbWUKKiByZWNlcHRpb24uCiogUmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBETUEgRW5naW5lIGlzIGN1cnJlbnRseSBlbmFibGVkIChhcyBjb250cm9sbGVkIHZpYSBoY2ZfY250bCksIGlmIHRoZSBETUEgY29udHJvbGxlcgoqIGRlcG9zaXRlZCBhbiBSeC1mcmFtZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoaXMgZnJhbWUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgUngtRGVzY3JpcHRvckxpc3QsCiogdHJhbnNmb3JtZWQgaW50byBhIEZyYW1lTGlzdCAoaS5lLiAgdXBkYXRpbmcgdGhlIGhvdXNla2VlcGluZyBmaWVsZHMgaW4gdGhlIGRlc2NyaXB0b3JzKSBhbmQgcmV0dXJuZWQgdG8gdGhlCiogY2FsbGVyLgoqIElmIG5vIHN1Y2ggUngtZnJhbWUgaXMgYXZhaWxhYmxlIGluIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIGJlaGF2aW9yIG9mIGhjZl9kbWFfcnhfZ2V0IGRlcGVuZHMgb24gdGhlCiogc3RhdHVzIG9mIHRoZSBETUEgRW5naW5lLgoqIElmIHRoZSBETUEgRW5naW5lIGlzIGVuYWJsZWQsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgoqIElmIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IGlzIHVzZWQ6CiogLSB0aGUgY29tcGxldGUgUngtRGVzY3JpcHRvckxpc3QgaXMgcmV0dXJuZWQuIFRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIG5vdCBwYXJ0IG9mIHRoZSBSeC1EZXNjcmlwdG9yTGlzdC4KKiAtIElmIHRoZXJlIGlzIG5vIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyByZXR1cm5lZC4KKiAtIElmIHRoZXJlIGlzIG5vIERFTFdBIERlc2NyaXB0b3IsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgoqCiogSWYgdGhlIE1TRiBwZXJmb3JtcyBhbiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIFJ4LURlc2NyaXB0b3JMaXN0IGFzIGRlc2NyaWJlZCBhYm92ZSwKKiB0aGUgZW5hYmxlIGNvbW1hbmQgd2lsbCByZXNldCBhbGwgaG91c2Uga2VlcGluZyBpbmZvcm1hdGlvbiwgaS5lLiBhbHJlYWR5IHJlY2VpdmVkIGJ1dCBub3QgeWV0IGJ5IHRoZSBNU0YKKiByZXRyaWV2ZWQgZnJhbWVzIGFyZSBsb3N0IGFuZCB0aGUgbmV4dCBmcmFtZSB3aWxsIGJlIHJlY2VpdmVkIHN0YXJ0aW5nIHdpdGggdGhlIG9sZGVzdCBkZXNjcmlwdG9yLgoqCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGRlY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCiogSWYgYXBwcm9wcmlhdGUsIGRlY2Fwc3VsYXRpb24gaXMgZG9uZSBieSBtb3Zpbmcgc29tZSBkYXRhIGluc2lkZSB0aGUgYnVmZmVycyBhbmQgdXBkYXRpbmcgdGhlIGRlc2NyaXB0b3JzCiogYWNjb3JkaW5nbHkuCiohISA7Pz8/Pz93aGVyZSBkaWQgSSBkZXNjcmliZSB3aHkgYSBzaW1wbGUgbWFuaXB1bGF0aW9uIHdpdGggdGhlIGNvdW50IHZhbHVlcyBkb2VzIG5vdCBzdWZmaWNlPwoqCiouRElBR1JBTQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKREVTQ19TVFJDVCoKaGNmX2RtYV9yeF9nZXQgKElGQlAgaWZicCkKewpERVNDX1NUUkNUICpkZXNjcDsJLy8gcG9pbnRlciB0byBzdGFydCBvZiBGcmFtZUxpc3QKCglkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9SWCApOwoJaWYgKCBkZXNjcCAmJiBkZXNjcC0+YnVmX2FkZHIgKSAgLy8hYmUgYXdhcmUgb2YgdGhlIG1pc3NpbmcgY3VybHkgYnJhY2tldAoKCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCglpZiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKQojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCiAgICB7CmludCBpOwpERVNDX1NUUkNUICpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOwkvL3BvaW50ZXIgdG8gMm5kIGRlc2NyaXB0b3Igb2YgZnJhbWUKCQlIQ0ZBU1NFUlQocCwgMCkKCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgKG1heWJlKSBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KCQkvL2RldGVybWluZSBkZWNhcHN1bGF0aW9uIHN1Yi1mbGFnIGluIFJ4RlMKCQlpID0gKih3Y2lfcmVjb3JkcCkmZGVzY3AtPmJ1Zl9hZGRyW0hGU19TVEFUXSAmICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKTsKCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8CgkJCSAoIGkgPT0gSEZTX1NUQVRfMTA0MiAmJiBoY2ZfZW5jYXAoICh3Y2lfYnVmcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKSAhPSBFTkNfVFVOTkVMICkpIHsKCQkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgU05BUCBoZWFkZXIgcGx1cyBwYXJ0IG9yIHdob2xlIG9mIHRoZSBwYXlsb2FkLgoJCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPT0gKHAtPmJ1Zl9hZGRyWzVdICsgKHAtPmJ1Zl9hZGRyWzRdPDw4KSArIDIqNiArIDIgLSA4KSwgcC0+QlVGX0NOVCApCgkJCS8vIHBlcmZvcm0gZGVjYXBzdWxhdGlvbgoJCQlIQ0ZBU1NFUlQocC0+QlVGX1NJWkUgPj04LCBwLT5CVUZfU0laRSkKCQkJLy8gbW92ZSBTQVsyOjVdIGluIHRoZSBzZWNvbmQgYnVmZmVyIHRvIHJlcGxhY2UgcGFydCBvZiB0aGUgU05BUCBoZWFkZXIKCQkJZm9yICggaT0zOyBpID49IDA7IGktLSkgcC0+YnVmX2FkZHJbaSs4XSA9IHAtPmJ1Zl9hZGRyW2ldOwoJCQkvLyBjb3B5IERBWzA6NV0sIFNBWzA6MV0gZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kIGJ1ZmZlcgoJCQlmb3IgKCBpPTA7IGk8ODsgaSsrKSBwLT5idWZfYWRkcltpXSA9IGRlc2NwLT5idWZfYWRkcltIRlNfQUREUl9ERVNUICsgaV07CgkJCS8vIG1ha2UgZmlyc3QgYnVmZmVyIHNob3J0ZXIgaW4gY291bnQKCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfQUREUl9ERVNUOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9FTkMKCWlmICggZGVzY3AgPT0gTlVMTCApIGlmYnAtPklGQl9EbWFQYWNrZXRzICY9IChoY2ZfMTYpfkhSRUdfRVZfUkRNQUQ7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfR0VUICkKCXJldHVybiBkZXNjcDsKfSAvLyBoY2ZfZG1hX3J4X2dldAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJdm9pZCBoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCiouUFVSUE9TRQkJc3VwcGx5IGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCioJCQkJc3VwcGx5IHRoZSBSeC1ERUxXQSBkZXNjcmlwdG9yLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJZGVzY3AJCWFkZHJlc3Mgb2YgYSBEZXNjcmlwdG9yTGlzdAoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgTVNGIHRvIHN1cHBseSB0aGUgSENGIHdpdGggbmV3L21vcmUgYnVmZmVycyBmb3IgcmVjZWl2ZSBwdXJwb3Nlcy4KKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKiBBcyBhIGNvbnNlcXVlbmNlLCBzb21lIGFkZGl0aW9uYWwgY29uc3RhaW50cyBhcHBseSB0byB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3IgYW5kIHRoZSBidWZmZXJzIGFzc29jaWF0ZWQKKiB3aXRoIHRoZSBmaXJzdCAyIGRlc2NyaXB0b3JzLiBJbmRlcGVuZGVudCBvZiB0aGUgZW5jYXBzdWxhdGlvbiBmZWF0dXJlLCB0aGUgQ09VTlQgZmllbGRzIGFyZSBpZ25vcmVkLgoqIEEgc3BlY2lhbCBjYXNlIGlzIHRoZSBzdXBwbHlpbmcgb2YgdGhlIERFTFdBIGRlc2NyaXB0b3IsIHdoaWNoIG11c3QgYmUgc3VwcGxpZWQgYXMgdGhlIGZpcnN0IGRlc2NyaXB0b3IuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKiAtIGluIGNhc2UgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgoqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIHRoZSBleGFjdCBzaXplIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgUnhGUyB1cCB0byB0aGUgODAyLjMgRGVzdEFkZHIKKgkJZmllbGQgKD09IDI5IHdvcmRzKS4KKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgoqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgbWluaW11bSBzaXplIG9mIDggYnl0ZXMuCiohISBUaGUgMm5kIHBhcnQgb2YgdGhlIGxpc3Qgb2YgYXNzZXJ0cyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcHV0X2ZyYW1lX2xzdCwgaW4gb3JkZXIgdG8gZ2V0CiohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCiogLSBETUEgaXMgbm90IGVuYWJsZWQKKiAtIGRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCiogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoqIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCiogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAoqIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCiohISAtIFBvc3NpYmx5IG1vcmUgY2hlY2tzIGNvdWxkIGJlIGFkZGVkICEhISEhISEhISEhISEKKgoqLkRJQUdSQU0KKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmhjZl9kbWFfcnhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwICkKewoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVCwgMHhEQTAxICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCglwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1JYICk7CiNpZiBIQ0ZfQVNTRVJUICYmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCWlmICggZGVzY3AtPmJ1Zl9hZGRyICkgewoJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID09IEhDRl9ETUFfUlhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKQoJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkgLy8gZmlyc3QgZGVzY3JpcHRvciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZXNjcmlwdG9yCgkJLy8gVGhlIHNlY29uZCBEQiBpcyBmb3IgU05BUCBhbmQgcGF5bG9hZCBwdXJwb3Nlcy4gSXQgc2hvdWxkIGJlIGEgbWluaW11bSBvZiAxMiBieXRlcyBpbiBzaXplLgoJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSA+PSAxMiwgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSApCgl9CiNlbmRpZiAvLyBIQ0ZBU1NFUlQgLyBIQ0ZfRU5DCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVCApCn0gLy8gaGNmX2RtYV9yeF9wdXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCURNQSBtb2RlOiByZWNsYWltcyBhbmQgZGVjYXBzdWxhdGVzIHBhY2tldHMgaW4gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gaWY6CioJCQkJIC0gQSBUeCBwYWNrZXQgaGFzIGJlZW4gY29waWVkIGZyb20gaG9zdC1SQU0gaW50byBOSUMtUkFNIGJ5IHRoZSBETUEgZW5naW5lCioJCQkJIC0gVGhlIEhlcm1lcy9ETUFlbmdpbmUgaGF2ZSBiZWVuIGRpc2FibGVkCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglwb2ludGVyIHRvIGEgcmVjbGFpbWVkIFR4IHBhY2tldC4KKgoqLkRFU0NSSVBUSU9OCiogaW1wYWN0IG9mIHRoZSBkaXNhYmxlIGNvbW1hbmQ6CiogV2hlbiBhIG5vbi1lbXB0eSBwb29sIG9mIFR4IGRlc2NyaXB0b3JzIGV4aXN0cyAoY3JlYXRlZCBieSBtZWFucyBvZiBoY2ZfZG1hX3B1dF90eCksIHRoZSBNU0YKKiBpcyBzdXBwb3NlZCB0byBlbXB0eSB0aGF0IHBvb2wgYnkgbWVhbnMgb2YgaGNmX2RtYV90eF9nZXQgY2FsbHMgYWZ0ZXIgdGhlIGRpc2FibGUgaW4gYW4KKiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZS4KKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERVNDX1NUUkNUKgpoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKewpERVNDX1NUUkNUICpkZXNjcDsJLy8gcG9pbnRlciB0byBzdGFydCBvZiBGcmFtZUxpc3QKCglkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9UWCApOwoJaWYgKCBkZXNjcCAmJiBkZXNjcC0+YnVmX2FkZHIgKSAgLy8hYmUgYXdhcmUgb2YgdGhlIG1pc3NpbmcgY3VybHkgYnJhY2tldAoJCQkJCQkJCQkJCS8vc2tpcCBkZWNhcHN1bGF0aW9uIGF0IGNvbmZpbmVkIGRlc2NyaXB0b3IKI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQlpZiAoICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX1RZUEUgKQojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJCQkgfHwgKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfREFUICkKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCSkgeyAvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24gaWYgbmVlZGVkCgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkciAtPSBIQ0ZfREFTQV9TSVpFOwoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQgCQkgKz0gSENGX0RBU0FfU0laRTsKCQl9CiNlbmRpZiAvLyBIQ0ZfRU5DCglpZiAoIGRlc2NwID09IE5VTEwgKSB7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKCQlpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1RETUFEOwoJfQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9HRVQgKQoJcmV0dXJuIGRlc2NwOwp9IC8vIGhjZl9kbWFfdHhfZ2V0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQl2b2lkIGhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCiouUFVSUE9TRQkJcHV0cyBhIHBhY2tldCBpbiB0aGUgVHggRE1BIHF1ZXVlIGluIGhvc3QgcmFtIGFuZCBraWNrcyBvZmYgdGhlIFR4RG1hIGVuZ2luZS4KKgkJCQlzdXBwbHkgdGhlIFR4LURFTFdBIGRlc2NyaXB0b3IuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglkZXNjcAkJYWRkcmVzcyBvZiBUeCBEZXNjcmlwdG9yIENoYWluIChpLmUuIGEgc2luZ2xlIFR4IGZyYW1lKQoqCXR4X2NudGwJCWluZGljYXRlcyBNQUMtcG9ydCBhbmQgKEhlcm1lcykgb3B0aW9ucwoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKgoqIFJlZ2FyZGxlc3Mgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQsIHRoZSBkZXNjcmlwdG9yIGxpc3QgY3JlYXRlZCB0byBkZXNjcmliZSB0aGUgZnJhbWUgdG8gYmUKKiB0cmFuc21pdHRlZCwgbXVzdCBzdXBwbHkgc3BhY2UgdG8gY29udGFpbiB0aGUgODAyLjExIGhlYWRlciwgcHJlY2VkaW5nIHRoZSBhY3R1YWwgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuCiogQmFzaWNhbGx5LCB0aGlzIG9ubHkgc3VwcGxpZXMgd29ya2luZyBzdG9yYWdlIHRvIHRoZSBIQ0Ygd2hpY2ggcGFzc2VzIHRoaXMgb24gdG8gdGhlIERNQSBlbmdpbmUuCiogQXMgYSBjb25zZXF1ZW5jZSB0aGUgY29udGVudHMgb2YgdGhpcyBzcGFjZSBkbyBub3QgbWF0dGVyLgoqIE5ldmVydGhlbGVzcyBCVUZfQ05UIG11c3QgdGFrZSBpbiBhY2NvdW50IHRoaXMgc3RvcmFnZS4KKiBUaGlzIHdvcmtpbmcgc3BhY2UgdG8gY29udGFpbiB0aGUgODAyLjExIGhlYWRlciBtYXkgbm90IGJlIGZyYWdtZW50ZWQsIHRoZSBmaXJzdCBidWZmZXIgbXVzdCBiZQoqIHN1ZmZpY2llbnRseSBsYXJnZSB0byBjb250YWluIGF0IGxlYXN0IHRoZSA4MDIuMTEgaGVhZGVyLCBpLmUuIEhGU19BRERSX0RFU1QgKDI5IHdvcmRzIG9yIDB4M0EgYnl0ZXMpLgoqIFRoaXMgd2F5LCB0aGUgSENGIGNhbiBzaW1wbHksIHJlZ2FyZGxlc3Mgd2hldGhlciBvciBub3QgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB3cml0ZSB0aGUgcGFyYW1ldGVyCiogdHhfY250bCBhdCBvZmZzZXQgMHgzNiAoSEZTX1RYX0NOVEwpIGluIHRoZSBmaXJzdCBidWZmZXIuCiogTm90ZSB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBwYXJ0IG9yIGFsbCBvZiB0aGUgYWN0dWFsIGZyYW1lIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCBkZXNjcmlwdG9yIGFzIGxvbmcKKiBhcyB0aGUgcmVxdWlyZW1lbnQgZm9yIHN0b3JhZ2UgZm9yIHRoZSA4MDIuMTEgaGVhZGVyIGlzIG1ldCwgaS5lLiB0aGUgODAyLjMgZnJhbWUgc3RhcnRzIGF0IG9mZnNldAoqIEhGU19BRERSX0RFU1QuCiogRXhjZXB0IGZvciB0aGUgQXNzZXJ0IG9uIHRoZSAxc3QgYnVmZmVyIGluIGNhc2Ugb2YgRW5jYXBzdWFsdGlvbiwgdGhlIFNJWkUgZmllbGRzIGFyZSBpZ25vcmVkLgoqCiogSW4gY2FzZSB0aGUgZW5jYXBzdWxhdGlvbiBmZWF0dXJlIGlzIGNvbXBpbGVkIGluLCB0aGVyZSBhcmUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cy4KKiBvIFRoZSBCVUZfQ05UIG9mIHRoZSBmaXJzdCBidWZmZXIgY2hhbmdlcyBmcm9tIGEgbWluaW11bSBvZiAweDNBIGJ5dGVzIHRvIGV4YWN0bHkgMHgzQSwgaS5lLiB0aGUgd29ya3NwYWNlCioJdG8gc3RvcmUgdGhlIDgwMi4xMSBoZWFkZXIKKiBvIFRoZSBCVUZfU0laRSBvZiB0aGUgZmlyc3QgYnVmZmVyIGlzIGF0IGxlYXN0IHRoZSBzcGFjZSBuZWVkZWQgdG8gc3RvcmUgdGhlCioJLSA4MDIuMTEgaGVhZGVyICgyOSB3b3JkcykKKgktIDgwMi4zIGhlYWRlciwgaS5lLiAxMiBieXRlcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCAyIGJ5dGVzIGxlbmd0aCBmaWVsZAoqCS0gNiBieXRlcyBTTkFQLWhlYWRlcgoqICAgVGhpcyByZXN1bHRzIGluIDM5IHdvcmRzIG9yIDB4NEUgYnl0ZXMgb3IgSEZTX1RZUEUuCiogICBOb3RlIHRoYXQgaWYgdGhlIEJVRl9TSVpFIGlzIGxhcmdlciB0aGFuIDB4NEUsIHRoaXMgc3VycGx1cyBpcyBub3QgdXNlZC4KKiBvIFRoZSBhY3R1YWwgZnJhbWUgYmVnaW5zIGluIHRoZSAybmQgZGVzY3JpcHRvciAod2hpY2ggaXMgYWxyZWFkeSBpbXBsaWVkIGJ5IHRoZSBCVUZfQ05UID09IDB4M0EgcmVxdWlyZW1lbnQpIGFuZCB0aGUgYXNzb2NpYXRlZCBidWZmZXIgY29udGFpbnMgYXQgbGVhc3QgdGhlIDgwMi4zIGhlYWRlciwgaS5lLiB0aGUgMTQgYnl0ZXMgcmVwcmVzZW50aW5nIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gYW5kIGxlbmd0aC90eXBlIGZpZWxkCioKKiAgIFdoZW4gdGhlIEhDRiBkb2VzIG5vdCBlbmNhcHN1bGF0ZXMgKGkuZS4gbGVuZ3RoL3R5cGUgZmllbGQgPD0gMTUwMCksICBubyBjaGFuZ2VzIGFyZSBtYWRlIHRvIGRlc2NyaXB0b3JzCiogICBvciBidWZmZXJzLgoqCiogICBXaGVuIHRoZSBIQ0YgYWN0dWFsbHkgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkID4gMTUwMCksIGl0IHN1Y2Nlc3NpdmVseSB3cml0ZXMsIHN0YXJ0aW5nIGF0CiogICBvZmZzZXQgSEZTX0FERFJfREVTVCAoMHgzQSkgaW4gdGhlIGZpcnN0IGJ1ZmZlcjoKKiAgICAgLSB0aGUgODAyLjMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgY29waWVkIGZyb20gdGhlIGJlZ2luIG9mIHRoZSBzZWNvbmQgYnVmZmVyCiogICAgIC0gdGhlIGZyYW1lIGxlbmd0aCwgZGVyaXZlZCBmcm9tIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluZGl2aWR1YWwgZnJhZ21lbnRzLCBjb3JyZWN0ZWQgZm9yIHRoZSBTTkFQCiogICAJaGVhZGVyIGxlbmd0aCBhbmQgVHlwZSBmaWVsZCBhbmQgaWdub3JpbmcgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBMZW5ndGggZmllbGQKKiAJICAtIHRoZSBhcHByb3ByaWF0ZSBzbmFwIGhlYWRlciAoVHVubmVsIG9yIDEwNDIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZmllbGQpLgoqCiogCSBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IHR3byBkZXNjcmlwdG9ycyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseToKKiAJICAtIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGNvdW50IGlzIGNoYW5nZWQgZnJvbSAweDNBIHRvIDB4NEUgKEhGU19UWVBFKSwgd2hpY2ggbWF0Y2hlcyAweDNBICsgMTIgKyAyICsgNgoqIAkgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIGNvdW50IGlzIGRlY3JlYXNlZCBieSAxMiwgYmVpbmcgdGhlIG1vdmVkIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24KKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciAocGh5c2ljYWwpIGJ1ZmZlciBhZGRyZXNzIGlzIGluY3JlYXNlZCBieSAxMi4KKgoqIFdoZW4gdGhlIGRlc2NyaXB0b3JzIGFyZSByZXR1cm5lZCBieSBoY2ZfZG1hX3R4X2dldCwgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBmaXJzdCB0d28gZGVzY3JpcHRvcnMgaXMKKiB1bmRvbmUuCioKKiBVbmRlciBhbnkgb2YgdGhlIGFib3ZlIHNjZW5hcmlvcywgdGhlIGFzc2VydCBCVUZfQ05UIDw9IEJVRl9TSVpFIG11c3QgYmUgdHJ1ZSBmb3IgYWxsIGRlc2NyaXB0b3JzCiogSW4gY2FzZSBvZiBlbmNhcHN1bGF0aW9uLCBCVUZfU0laRSBvZiB0aGUgMXN0IGRlc2NyaXB0b3IgaXMgYXNzZXJ0ZWQgdG8gYmUgYXQgbGVhc3QgSEZTX1RZUEUgKDB4NEUpLCBzbyBpdCBpcyBOT1QgdGVzdGVkLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSB0eF9jbnRsIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCiogLSBpbiBjYXNlIGVuY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgoqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGV4YWN0bHkgdGhlIChzcGFjZSBmb3IpIHRoZSA4MDIuMTEgaGVhZGVyICg9PSAyOCB3b3JkcykKKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSBhIHNpemUgdG8gYWRkaXRpb25hbGx5IGFjY29tb2RhdGUgdGhlIDgwMi4zIGhlYWRlciBhbmQgdGhlCioJCVNOQVAgaGVhZGVyIG9mIHRoZSBmcmFtZSBhZnRlciBlbmNhcHN1bGF0aW9uICg9PSAzOSB3b3JkcykuCioJICAtCVRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUvbGVuZ3RoJyAoPT0xNCBieXRlcyBvciA3IHdvcmRzKQoqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAoqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCiouRElBR1JBTQoqCiouTk9USUNFCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqCioxOglXcml0ZSB0eF9jbnRsIHBhcmFtZXRlciB0byBIRlNfVFhfQ05UTCBmaWVsZCBpbnRvIHRoZSBIZXJtZXMtc3BlY2lmaWMgaGVhZGVyIGluIGJ1ZmZlciAxCio0OglkZXRlcm1pbmUgd2hldGhlciBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZCBhbmQgd3JpdGUgdGhlIHR5cGUgKHR1bm5lbCBvciAxMDQyKSBhbHJlYWR5IGF0IHRoZSBhcHByb3ByaWF0ZQoqCW9mZnNldCBpbiB0aGUgMXN0IGJ1ZmZlcgoqNjoJQnVpbGQgdGhlIGVuY2Fwc3VhbHRpb24gZW52ZWxvcHBlIGluIHRoZSBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIDFzdCBidWZmZXIKKgktIENvcHkgREEvU0EgZmllbGRzIGZyb20gdGhlIDJuZCBidWZmZXIKKiAgIC0gQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAoc25hcC1oZWFkZXIgKyB0eXBlLWZpZWxkICsgdGhlIGxlbmd0aCBvZiBhbGwgYnVmZmVyIGZyYWdtZW50cwoqICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIDgwMi4zIGZyYW1lIChpLmUgYWxsIGRlc2NyaXB0b3JzIGV4Y2VwdCB0aGUgZmlyc3QpLCBidXQgbm90IHRoZSBEZXN0aW5hdGlvbkFkZHJlc3MsCiogICAgIFNvdXJjZUFkZHJlc3MgYW5kIGxlbmdodC1maWVsZCkKKiAgICAgQXNzZXJ0IHRoZSBtZXNzYWdlIGxlbmd0aAoqCSAgV3JpdGUgbGVuZ3RoLiBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4gQkUgZm9ybWF0LCBoZW5jZSBvbiBMRSBwbGF0Zm9ybXMgdGhlIGxlbmd0aCBtdXN0IGJlIGNvbnZlcnRlZAoqCSAgOz8gVEhJUyBJUyBOT1QgV0hBVCBDVVJSRU5UTFkgSVMgSU1QTEVNRU5URUQKKgktIFdyaXRlIHNuYXAgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc25hcCBoZWFkZXIgaXMgTk9UIGNvcGllZCwgdGhhdCBieXRlIGlzIGFscmVhZHkgaW4KKgkgIHBsYWNlIGFzIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBoY2ZfZW5jYXAuCioJTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdG8gc2tpbiBhIGNhdC4gVG8gZXhwcmVzcyB0aGUgb2Zmc2V0cyBpbiB0aGUgMXN0IGJ1ZmZlciB3aGlsZSB3cml0aW5nCioJdGhlIHNuYXAgaGVhZGVyLCBIRlNfVFlQRSBpcyBjaG9vc2VuIGFzIGEgcmVmZXJlbmNlIHBvaW50IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGdyYXNwIHRoYXQgdGhlIHNuYXAgaGVhZGVyCioJYW5kIGVuY2Fwc3VhbHRpb24gdHlwZSBhcmUgYXQgbGVhc3QgcmVsYXRpdmUgaW4gdGhlIHJpZ2h0LgoqODoJbW9kaWZ5IDFzdCBkZXNjcmlwdG9yIHRvIHJlZmxlY3QgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyICsgU25hcC1oZWFkZXIKKgltb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyIChEQS9TQQoqMTA6IHNldCBlYWNoIGRlc2NyaXB0b3IgdG8gJ0RNQSBvd25lZCcsICBjbGVhciBhbGwgb3RoZXIgY29udHJvbCBiaXRzLgoqCVNldCBTT1AgYml0IG9uIGZpcnN0IGRlc2NyaXB0b3IuIFNldCBFT1AgYml0IG9uIGxhc3QgZGVzY3JpcHRvci4KKjEyOiBFaXRoZXIgYXBwZW5kIHRoZSBjdXJyZW50IGZyYW1lIHRvIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IgbGlzdCBvcgoqMTQ6IGNyZWF0ZSBhIGxpc3QgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnJlbnQgZnJhbWUKKjE2OiByZW1lbWJlciB0aGUgbmV3IGVuZCBvZiB0aGUgbGlzdAoqMjA6IGhhbmQgdGhlIGZyYW1lIG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCnsKREVTQ19TVFJDVAkqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKaW50CQkJaTsKCiNpZiBIQ0ZfQVNTRVJUCglpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CglIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICkKI2VuZGlmIC8vIEhDRl9BU1NFUlQKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVCwgMHhEQTAzICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCUhDRkFTU0VSVCggKCBpZmJwLT5JRkJfQ250bE9wdCAmIChVU0VfRE1BfERNQV9FTkFCTEVEKSApID09IChVU0VfRE1BfERNQV9FTkFCTEVEKSwgaWZicC0+SUZCX0NudGxPcHQpCgoJaWYgKCBkZXNjcC0+YnVmX2FkZHIgKSB7CgkJKihoY2ZfMTYqKShkZXNjcC0+YnVmX2FkZHIgKyBIRlNfVFhfQ05UTCkgPSB0eF9jbnRsOwkJCQkJCQkJCQkJLyoxKi8KI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApCQkJCQkJCQkJLy9hdCBsZWFzdCAyIGRlc2NyaXBvcnMKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfQ05UID09IEhGU19BRERSX0RFU1QsIGRlc2NwLT5CVUZfQ05UICkJLy9leGFjdCBsZW5ndGggcmVxdWlyZWQgZm9yIDFzdCBidWZmZXIKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA+PSBIQ0ZfRE1BX1RYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICkJLy9taW5pbWFsIHN0b3JhZ2UgZm9yIGVuY2Fwc3VsYXRpb24KCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPj0gMTQsIHAtPkJVRl9DTlQgKTsJCQkJCS8vYXQgbGVhc3QgREEsIFNBIGFuZCAndHlwZScgaW4gMm5kIGJ1ZmZlcgoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCQkvKiBpZiB3ZSBhcmUgZG9pbmcgUFBLICsvLSBDTUlDLCBvciB3ZSBhcmUgc2VuZGluZyBhIEREUCBmcmFtZSAqLwoJCWlmICggKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT04gKSB8fAoJCQkgKCAoIHAtPkJVRl9DTlQgPj0gMjAgKQkJICYmICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09GRiApICYmCgkJCSAoIHAtPmJ1Zl9hZGRyWzEyXSA9PSAweEFBICkgJiYgKCBwLT5idWZfYWRkclsxM10gPT0gMHhBQSApICYmCgkJCSAoIHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzICkgJiYgKCBwLT5idWZfYWRkclsxNV0gPT0gMHgwMCApICYmCgkJCSAoIHAtPmJ1Zl9hZGRyWzE2XSA9PSAweDQwICkgJiYgKCBwLT5idWZfYWRkclsxN10gPT0gMHg5NiApICYmCgkJCSAoIHAtPmJ1Zl9hZGRyWzE4XSA9PSAweDAwICkgJiYgKCBwLT5idWZfYWRkclsxOV0gPT0gMHgwMCApKSkKCQl7CgkJCS8qIGNvcHkgdGhlIERBL1NBIHRvIHRoZSBmaXJzdCBidWZmZXIgKi8KCQkJZm9yICggaSA9IDA7IGkgPCBIQ0ZfREFTQV9TSVpFOyBpKysgKSB7CgkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gcC0+YnVmX2FkZHJbaV07CgkJCX0KCQkJLyogY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCBmcmFnbWVudCBvbmx5ICovCgkJCWkgPSAwOwoJCQlkbyB7IGkgKz0gcC0+QlVGX0NOVDsgfSB3aGlsZSggcCA9IHAtPm5leHRfZGVzY19hZGRyICk7CgkJCWkgLT0gSENGX0RBU0FfU0laRSA7CgkJCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBmaWVsZCB0byBiaWcgZW5kaWFuLCB1c2luZyB0aGUgZW5kaWFuIGZyaWVuZGx5IG1hY3JvcyAqLwoJCQlpID0gQ05WX1NIT1JUX1RPX0JJRyhpKTsJCS8vISEgdGhpcyBjb252ZXJ0cyBPTkxZIG9uIExFIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIG5vbi1DQ1ggY29kZQoJCQkqKGhjZl8xNiopKCZkZXNjcC0+YnVmX2FkZHJbSEZTX0xFTl0pID0gKGhjZl8xNilpOwoJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19EQVQ7CgkJCS8vIG1vZGlmeSAybmQgZGVzY3JpcHRvciB0byBza2lwIHRoZSAnRGEvU2EnIGZpZWxkcwoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgKz0gSENGX0RBU0FfU0laRTsKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkgLT0gSENGX0RBU0FfU0laRTsKCQl9CgkJZWxzZQojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJewoJCQlkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gPSBoY2ZfZW5jYXAoJmRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0pOwkJLyo0Ki8KCQkJaWYgKCBkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gIT0gRU5DX05PTkUgKSB7CgkJCQlmb3IgKCBpPTA7IGkgPCBIQ0ZfREFTQV9TSVpFOyBpKysgKSB7CQkJCQkJCQkJCQkJCQkvKjYqLwoJCQkJCWRlc2NwLT5idWZfYWRkcltpICsgSEZTX0FERFJfREVTVF0gPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW2ldOwoJCQkJfQoJCQkJaSA9IHNpemVvZihzbmFwX2hlYWRlcikgKyAyIC0gKCAyKjYgKyAyICk7CgkJCQlkbyB7IGkgKz0gcC0+QlVGX0NOVDsgfSB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOwoJCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IENOVl9FTkRfU0hPUlQoaSk7CS8vISEgdGhpcyBjb252ZXJ0cyBvbiBBTEwgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgQ0NYIGNvZGUKCQkJCWZvciAoIGk9MDsgaSA8IHNpemVvZihzbmFwX2hlYWRlcikgLSAxOyBpKyspIHsKCQkJCQlkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUgLSBzaXplb2Yoc25hcF9oZWFkZXIpICsgaV0gPSBzbmFwX2hlYWRlcltpXTsKCQkJCX0KCQkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX1RZUEU7CQkJCQkJCQkJCQkJCQkJCQkvKjgqLwoJCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyCSs9IEhDRl9EQVNBX1NJWkU7CgkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQJCQktPSBIQ0ZfREFTQV9TSVpFOwoJCQl9CgkJfQojZW5kaWYgLy8gSENGX0VOQwogICAgfQoJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9UWCApOwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9QVVQgKQp9IC8vIGhjZl9kbWFfdHhfcHV0CgojZW5kaWYgLy8gSENGX0RNQQoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWhjZl84IGhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApCiouUFVSUE9TRQkJdGVzdCB3aGV0aGVyIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKgoqLkFSR1VNRU5UUwoqCXR5cGUJCShGYXIpIHBvaW50ZXIgdG8gdGhlIChCaWcgRW5kaWFuKSBUeXBlL0xlbmd0aCBmaWVsZCBpbiB0aGUgbWVzc2FnZQoqCiouUkVUVVJOUwoqCUVOQ19OT05FCQlsZW4vdHlwZSBpcyAibGVuIiAoIChCSUdfRU5ESUFOKXR5cGUgPD0gMTUwMCApCioJRU5DX1RVTk5FTAkJbGVuL3R5cGUgaXMgInR5cGUiIGFuZCAweDgwRjMgb3IgMHg4MTM3CioJRU5DXzEwNDIJCWxlbi90eXBlIGlzICJ0eXBlIiBidXQgbm90IDB4ODBGMyBvciAweDgxMzcKKgoqLkNPTkRJVElPTlMKKglOSUMgSW50ZXJydXB0cwlkLmMKKgoqLkRFU0NSSVBUSU9OCiogVHlwZSBtdXN0IHBvaW50IHRvIHRoZSBMZW4vVHlwZSBmaWVsZCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB0aGUgMi1ieXRlIGZpZWxkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSA2IGJ5dGUKKiBEZXN0aW5hdGlvbiBBZGRyZXNzIGFuZCA2IGJ5dGUgU291cmNlIEFkZHJlc3MuICBUaGUgMiBzdWNjZXNzaXZlIGJ5dGVzIGFkZHJlc3NlZCBieSB0eXBlIGFyZSBpbnRlcnByZXRlZCBhcwoqIGEgQmlnIEVuZGlhbiB2YWx1ZS4gIElmIHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE1MDAsIHRoZSBtZXNzYWdlIGlzIGFzc3VtZWQgdG8gYmUgaW4gODAyLjMKKiBmb3JtYXQuICBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiBFdGhlcm5ldC1JSSBmb3JtYXQuICBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIExlbi9UeXAsCiogQnJpZGdlIFR1bm5lbCBvciBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgoqCiouRElBR1JBTQoqCiogIDE6CXByZXN1bWUgODAyLjMsIGhlbmNlIHByZXNldCByZXR1cm4gdmFsdWUgYXQgRU5DX05PTkUKKiAgMjoJY29udmVydCB0eXBlIGZyb20gIm5ldHdvcmsiIEVuZGlhbiBmb3JtYXQgdG8gbmF0aXZlIEVuZGlhbgoqICA0Ogl0aGUgbGl0bXVzIHRlc3QgdG8gZGlzdGluZ3Vpc2ggdHlwZSBhbmQgbGVuLgoqCVRoZSBoYXJkIGNvZGUgIm1hZ2ljIiB2YWx1ZSBvZiAxNTAwIGlzIGludGVudGlvbmFsIGFuZCBzaG91bGQgTk9UIGJlIHJlcGxhY2VkIGJ5IGEgbW5lbW9uaWMgYmVjYXVzZSBpdCBpcwoqCW5vdCByZWxhdGVkIGF0IGFsbCB0byB0aGUgbWF4aW11bSBmcmFtZSBzaXplIHN1cHBvcnRlZCAgYnkgdGhlIEhlcm1lcy4KKiAgNjoJY2hlY2sgdHlwZSBhZ2FpbnN0OgoqCQkweDgwRjMJLy9BcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQoqCQkweDgxMzcJLy9JUFgKKgl0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZW5jYXBzdWxhdGlvbgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgSENGX0VOQ0FQCS8vaS5lIEhDRl9FTkMgb3IgSENGX0VOQ19TVVAKI2lmICEgKCAoSENGX0VOQ0FQKSAmIEhDRl9FTkNfU1VQICkKSENGX1NUQVRJQwojZW5kaWYgLy8gSENGX0VOQ0FQCmhjZl84CmhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApCnsKCmhjZl84CXJjID0gRU5DX05PTkU7CQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMSAqLwpoY2ZfMTYJdCA9IChoY2ZfMTYpKCp0eXBlPDw4KSArICoodHlwZSsxKTsJCQkJCQkJCQkJCQkJCQkJLyogMiAqLwoKCWlmICggdCA+IDE1MDAgKSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogNCAqLwoJCWlmICggdCA9PSAweDgxMzcgfHwgdCA9PSAweDgwRjMgKSB7CgkJCXJjID0gRU5DX1RVTk5FTDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogNiAqLwoJCX0gZWxzZSB7CgkJCXJjID0gRU5DXzEwNDI7CgkJfQoJfQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9lbmNhcAojZW5kaWYgLy8gSENGX0VOQ0FQCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJaW50IGhjZl9nZXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQoqLlBVUlBPU0UJCU9idGFpbnMgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUgQ2FyZCBhbmQgZnJvbSB0aGUgSENGLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJYWRkcmVzcyBvZiBMZW5ndGhUeXBlVmFsdWUgc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ3aGF0IiBhbmQgdGhlICJob3cgbXVjaCIgb2YgdGhlCioJCQkJaW5mb3JtYXRpb24gdG8gYmUgY29sbGVjdGVkIGZyb20gdGhlIEhDRiBvciBmcm9tIHRoZSBIZXJtZXMKKgoqLlJFVFVSTlMKKglIQ0ZfRVJSX0xFTgkJCVRoZSBwcm92aWRlZCBidWZmZXIgd2FzIHRvbyBzbWFsbAoqCUhDRl9TVUNDRVNTCQkJU3VjY2VzcwoqISEJdmlhIGNtZF9leGUgKCB0eXBlID49IENGR19SSURfRldfTUlOICkKKglIQ0ZfRVJSX05PX05JQwkJTklDIHJlbW92ZWQgZHVyaW5nIHJldHJpZXZhbAoqCUhDRl9FUlJfVElNRV9PVVQJRXhwZWN0ZWQgSGVybWVzIGV2ZW50IGRpZCBub3Qgb2NjdXJlIGluIGV4cGVjdGVkIHRpbWUKKiEhCXZpYSBjbWRfZXhlIGFuZCBzZXR1cF9iYXAgKHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKQoqCUhDRl9FUlJfREVGVU5DVF8uLi4JSENGIGlzIGluIGRlZnVuY3QgbW9kZSAoYml0cyAweDdGIHJlZmxlY3QgY2F1c2UpCioKKi5ERVNDUklQVElPTgoqIFRoZSBULWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIFJJRCB3YW50ZWQuIFRoZSBSSUQKKiBpbmZvcm1hdGlvbiBpZGVudGlmaWVkIGJ5IHRoZSBULWZpZWxkIGlzIGNvcGllZCBpbnRvIHRoZSBWLWZpZWxkLgoqIE9uIGVudHJ5LCB0aGUgTC1maWVsZCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYWxzbyBjYWxsZWQgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiLiBUaGUgTC12YWx1ZQoqIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSBULWZpZWxkLCBidXQgbm90IHRoZSBzaXplIG9mIHRoZSBMLWZpZWxkIGl0c2VsZi4KKiBPbiByZXR1cm4sIHRoZSBMLWZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFjdHVhbGx5IGNvbnRhaW5lZCBieSB0aGUgVHlwZSBhbmQgVmFsdWUgZmllbGRzLgoqIEFzIHRoZSBzaXplIG9mIHRoZSBUeXBlIGZpZWxkIGluIHRoZSBMVFYtcmVjb3JkIGlzIGluY2x1ZGVkIGluIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBvZiB0aGUgcmVjb3JkLCB0aGUKKiBWLWZpZWxkIGNhbiBjb250YWluIGF0IG1vc3QgIkluaXRpYWwgRGF0YUxlbmd0aCIgLSAxIHdvcmRzIG9mIGRhdGEuCiogQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlIGNvbXBsZXRlIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGluZGljYXRlZCBieSB0aGUKKiAiSW5pdGlhbCBEYXRhTGVuZ3RoIiB3ZXJlIGNvcGllZC4gIFRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24KKiBJbmZvcm1hdGlvbiBibG9ja3MgdGhhdCBoYXZlIGRpZmZlcmVudCBzaXplcyBmb3IgZGlmZmVyZW50IEYvVyB2ZXJzaW9ucywgZS5nLiB3aGVuIGxhdGVyIHZlcnNpb25zIHN1cHBvcnQKKiBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLgoqIElmIHRoZSBzaXplIG9mIFZhbHVlIGZpZWxkIG9mIHRoZSBSSUQgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgLTEsIGFzIG11Y2ggZGF0YQoqIGFzIGZpdHMgaXMgY29waWVkLCBhbmQgYW4gZXJyb3Igc3RhdHVzIG9mIEhDRl9FUlJfTEVOIGlzIHJldHVybmVkLgoqCiogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gZGV0ZWN0IGNhcmQgcmVtb3ZhbCBhbmQgcmUtaW5zZXJ0aW9uIGFuZCBub3QgY2FsbCB0aGUgSENGIHdoZW4gdGhlCiogTklDIGlzIGFic2VudC4gVGhlIE1TRiBjYW5ub3QsIGhvd2V2ZXIsIHRpbWVseSBkZXRlY3QgYSBDYXJkIHJlbW92YWwgaWYgdGhlIENhcmQgaXMgcmVtb3ZlZCB3aGlsZQoqIGhjZl9nZXRfaW5mbyBpcyBpbiBwcm9ncmVzcy4gIFRoZXJlZm9yZSwgdGhlIEhDRiBwZXJmb3JtcyBpdHMgb3duIGNoZWNrIG9uIENhcmQgcHJlc2VuY2UgYWZ0ZXIgdGhlIHJlYWQKKiBvcGVyYXRpb24gb2YgdGhlIE5JQyBkYXRhLiAgSWYgdGhlIENhcmQgaXMgbm90IHByZXNlbnQgb3IgcmVtb3ZlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBoY2ZfZ2V0X2luZm8sCiogSENGX0VSUl9OT19OSUMgaXMgcmV0dXJuZWQgYW5kIHRoZSBjb250ZW50IG9mIHRoZSBEYXRhIEJ1ZmZlciBpcyB1bnByZWRpY3RhYmxlLiBUaGlzIGNoZWNrIGlzIG5vdCBwZXJmb3JtZWQKKiBpbiBjYXNlIG9mIHRoZSAiSENGIGVtYmVkZGVkIiBwc2V1ZG8gUklEcyBsaWtlIENGR19UQUxMSUVTLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCioJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCiogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgoqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIDAgb3IgMSBvciBoYXMgYW4gZXhjZXNzaXZlIHZhbHVlIChpLmUuIGV4Y2VlZHMgSENGX01BWF9MVFYpLgoqIC0gdHlwZSBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBpcyBpbnZhbGlkLgoqCiouRElBR1JBTQoqCUhjZl9nZXRfbWJfaW5mbyBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIGJsb2NrIGluIHRoZSBNYWlsQm94IHRvIFBDIFJBTS4gSWYgbGVuIGlzCioJbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2ssIG9ubHkgYXMgbXVjaCBhcyBmaXRzIGluIHRoZSBQQyBSQU0gYnVmZmVyIGlzIGNvcGllZC4gQWZ0ZXIKKgl0aGUgY29weWluZyB0aGUgTWFpbEJveCBSZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBNYWlsQm94IEluZm8gYmxvY2ssIGhlbmNlIHRoZQoqCXJlbWFpbmRlciBvZiBhbiAib3ZlcnNpemVkIiBNYWlsQm94IEluZm8gYmxvY2sgaXMgbG9zdC4gVGhlIHRydW5jYXRpb24gb2YgdGhlIE1haWxCb3ggSW5mbyBibG9jayBpcyBOT1QKKglyZWZsZWN0ZWQgaW4gdGhlIHJldHVybiBzdGF0dXMuIE5vdGUgdGhhdCBoY2ZfZ2V0X2luZm8gZ3VhcmFudGVlcyB0aGUgbGVuZ3RoIG9mIHRoZSBQQyBSQU0gYnVmZmVyIG1lZXRzCioJdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIGF0IGxlYXN0IDIsIHNvIG5vIFBDIFJBTSBidWZmZXIgb3ZlcnJ1bi4KKgoqCUNhbGxpbmcgaGNmX2dldF9tYl9pbmZvIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBJbmZvIGJsb2NrIGF2YWlsYWJsZSBvciB3aGVuIHRoZXJlIGlzIG5vIE1haWxCb3ggYXQgYWxsLAoqCXJlc3VsdHMgaW4gYSAiTlVMTCIgTWFpbEJveCBJbmZvIGJsb2NrLgoqCioxMjoJc2VlIE5PVElDRQoqMTc6IFRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF93YWl0IGFuZCB0aGUgZmlyc3QgaGNmaW9faW5fc3RyaW5nIGNhbiBiZSBpZ25vcmVkLCBiZWNhdXNlIHdoZW4gb25lIGZhaWxzLCB0aGUKKglvdGhlciBmYWlscyB2aWEgdGhlIElGQl9EZWZ1bmN0U3RhdCBtZWNoYW5pc20KKjIwOiAiSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKSIgaXMgbm90IHN1aXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGFsd2F5cyB0cmlnZ2VyIGFzIHNpZGUgZWZmZWN0IG9mCioJdGhlIEhDRkFTU0VSVCBpbiBoY2ZfcHV0X2luZm8gd2hpY2ggY2FsbHMgaGNmX2dldF9pbmZvIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgUklEIGV4aXN0cyBhdCBhbGwuCgoqLk5PVElDRQoqCioJIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHM6CioJQ0ZHX01CX0lORk8sIENGR19UQUxMSUVTLCBDRkdfRFJWX0lERU5USVRZLCBDRkdfRFJWX1NVUF9SQU5HRSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwKKglDRkdfRFJWX0FDVF9SQU5HRVNfU1RBLCBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJCioJTm90ZSB0aGUgSENGX0VSUl9MRU4gaXMgTk9UIGFkZXF1YXRlbHkgc2V0LCB3aGVuIEwgPj0gMiBidXQgbGVzcyB0aGFuIG5lZWRlZAoqCioJUmVtYXJrczogVHJhbnNmZXJzIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKglDYXJkIGFuZCBmcm9tIHRoZSBIQ0YgdG8gdGhlIE1TRi4KKglUaGUgZXhhY3QgbGF5b3V0IG9mIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBkZXBlbmRzIG9uIHRoZSBhY3Rpb24gY29kZS4gQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlCioJY29tcGxldGUgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiBieXRlcyBpbmRpY2F0ZWQgYnkgbGVuIGlzIGNvcGllZC4gIExlbgoqCWFjdHMgYXMgYSBzYWZlIGd1YXJkIGFnYWluc3QgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBibG9ja3Mgd2hpY2ggaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudAoqCUhlcm1lcyB2ZXJzaW9ucywgZS5nLiB3aGVuIGxhdGVyIHZlcnNpb25zIHN1cHBvcnQgbW9yZSB0YWxsaWVzIHRoYW4gZWFybGllciB2ZXJzaW9ucy4gSXQgaXMgYSBjb25zY2lvdXMKKglkZWNpc2lvbiB0aGF0IHVudXNlZCBwYXJ0cyBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQuCioKKglSZW1hcmtzOiBUaGUgb25seSBlcnJvciBhZ2FpbnN0IHdoaWNoIGlzIHByb3RlY3RlZCBpcyB0aGUgIlJlYWQgZXJyb3IiIGFzIHJlc3VsdCBvZiBDYXJkIHJlbW92YWwuIE9ubHkgdGhlCioJbGFzdCBoY2ZfaW9fc3RyaW5nIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJlY2F1c2UgaWYgdGhlIGZpcnN0IGZhaWxzIHRoZSBzZWNvbmQgd2lsbCBmYWlsIGFzIHdlbGwuIENoZWNraW5nCioJZm9yIGNtZF9leGUgZXJyb3JzIGlzIHN1cHBvc2VkIHN1cGVyZmx1b3VzIGJlY2F1c2UgcHJvYmxlbXMgaW4gY21kX2V4ZSBhcmUgYWxyZWFkeSBjYXVnaHQgb3Igd2lsbCBiZQoqCWNhdWdodCBieSBoY2ZfZW5hYmxlLgoqCioJQ0ZHX01CX0lORk86IGNvcHkgdGhlIG9sZGVzdCBNYWlsQm94IEluZm8gQmxvY2sgb3IgdGhlICJudWxsIiBibG9jayBpZiBub25lIGF2YWlsYWJsZS4KKgoqCVRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgoqCSAgLSBkdXJpbmcgdGhlIHBzZXVkby1hc3luY2hyb25vdXMgSGVybWVzIGNvbW1hbmRzIChkaWFnbm9zZSwgZG93bmxvYWQpCW9ubHkgQ0ZHX01CX0lORk8gaXMgYWNjZXB0YWJsZQoqCSAgLQlzb21lIGNvZGVzIChlLmcuIENGR19UQUxMSUVTKSBhcmUgZXhwbGljaXRseSBoYW5kbGVkIGJ5IHRoZSBIQ0Ygd2hpY2ggaW1wbGllcyB0aGF0IHRoZXNlIGNvZGVzCioJCWFyZSB2YWxpZAoqCSAgLSBhbGwgb3RoZXIgY29kZXMgaW4gdGhlIHJhbmdlIDB4RkMwMCB0aHJvdWdoIDB4RkZGRiBhcmUgcGFzc2VkIHRvIHRoZSBIZXJtZXMuICBUaGUgSGVybWVzIHJldHVybnMgYW4KKgkJTFRWIHJlY29yZCB3aXRoIGEgemVybyB2YWx1ZSBpbiB0aGUgTC1maWVsZCBmb3IgYWxsIFR5cC1jb2RlcyBpdCBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgaXMKKgkJZGVmaW5lZCBhbmQgaW50ZW5kZWQgYmVoYXZpb3IsIHNvIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2ggb24gdGhpcyBwaGVub21lbmEuCioJICAtCWFsbCByZW1haW5pbmcgY29kZXMgYXJlIGludmFsaWQgYW5kIGNhdXNlIGFuIEFTU0VSVC4KKgoqLkNPTkRJVElPTlMKKiBJbiBjYXNlIG9mIFVTQiwgSENGX01BWF9NU0cgOz9VU0VEOz8gdG8gbGltaXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgaGNmX2dldF9pbmZvLgoqCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKewoKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmXzE2CQlsZW4gPSBsdHZwLT5sZW47CmhjZl8xNgkJdHlwZSA9IGx0dnAtPnR5cDsKd2NpX3JlY29yZHAJcCA9ICZsdHZwLT5sZW47CQkvL2Rlc3RpbmF0aW9uIHdvcmQgcG9pbnRlciAoaW4gTFRWIHJlY29yZCkKaGNmXzE2CQkqcSA9IE5VTEw7CQkJCS8qIHNvdXJjZSB3b3JkIHBvaW50ZXIgIE5vdGUhISBET1MgQ09NIGNhbid0IGNvcGUgd2l0aCBGQVIKCQkJCQkJCQkJICogYXMgYSBjb25zZXF1ZW5jZSBNYWlsQm94IG11c3QgYmUgbmVhciB3aGljaCBpcyB1c3VhbGx5IHRydWUgYW55d2F5CgkJCQkJCQkJCSAqLwppbnQJCQlpOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfR0VUX0lORk8sIGx0dnAtPnR5cCApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCglIQ0ZBU1NFUlQoIGx0dnAsIDAgKQoJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGx0dnAtPnR5cCwgbHR2cC0+bGVuICkgKQoKCWx0dnAtPmxlbiA9IDA7CQkJCQkJCQkvL2RlZmF1bHQgdG86IE5vIEluZm8gQXZhaWxhYmxlCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQiAvL2ZpbHRlciBvdXQgYWxsIHNwZWNpYWxzCglmb3IgKCBpID0gMDsgKCBxID0geHh4eFtpXSApICE9IE5VTEwgJiYgcVsxXSAhPSB0eXBlOyBpKysgKSAvKk5PUCovOwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKI2lmIEhDRl9UQUxMSUVTCglpZiAoIHR5cGUgPT0gQ0ZHX1RBTExJRVMgKSB7CQkJCQkJCQkJCQkJCS8qMyovCgkJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9UQUxMSUVTICk7CgkJcSA9IChoY2ZfMTYqKSZpZmJwLT5JRkJfVGFsbHlMZW47Cgl9CiNlbmRpZiAvLyBIQ0ZfVEFMTElFUwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoJaWYgKCB0eXBlID09IENGR19NQl9JTkZPICkgewoJCWlmICggaWZicC0+SUZCX01CSW5mb0xlbiApIHsKCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CgkJCQlpZmJwLT5JRkJfTUJScCA9IDA7IC8vOz9Qcm9iYWJseSBzdXBlcmZsdW91cwoJCQl9CgkJCXEgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CgkJCWlmYnAtPklGQl9NQlJwICs9ICpxICsgMTsJLy91cGRhdGUgcmVhZCBwb2ludGVyCgkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewoJCQkJaWZicC0+SUZCX01CUnAgPSAwOwoJCQl9CgkJCWlmYnAtPklGQl9NQkluZm9MZW4gPSBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXTsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCglpZiAoIHEgIT0gTlVMTCApIHsJCQkJCQkvL2Egc3BlY2lhbCBvciBDRkdfVEFMTElFUyBvciBDRkdfTUJfSU5GTwoJCWkgPSBtaW4oIGxlbiwgKnEgKSArIDE7CQkJCS8vdG90YWwgc2l6ZSBvZiBkZXN0aW5hdGlvbiAoaW5jbHVkaW5nIFQtZmllbGQpCgkJd2hpbGUgKCBpLS0gKSB7CgkJCSpwKysgPSAqcTsKI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19SRVNFVAoJCQlpZiAoIHEgPiAmaWZicC0+SUZCX1RhbGx5VHlwICYmIHR5cGUgPT0gQ0ZHX1RBTExJRVMgKSB7CgkJCQkqcSA9IDA7CgkJCX0KI2VuZGlmIC8vIEhDRl9UQUxMSUVTX1JFU0VUCgkJCXErKzsKCQl9Cgl9IGVsc2UgewkJCQkJCQkJLy8gbm90IGEgc3BlY2lhbCBub3IgQ0ZHX1RBTExJRVMgbm9yIENGR19NQl9JTkZPCgkJaWYgKCB0eXBlID09IENGR19DTlRMX09QVCApIHsJCQkJCQkJCQkJLy9yZWFkIGJhY2sgZWZmZWN0aXZlIG9wdGlvbnMKCQkJbHR2cC0+bGVuID0gMjsKCQkJbHR2cC0+dmFsWzBdID0gaWZicC0+SUZCX0NudGxPcHQ7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKCQl9IGVsc2UgaWYgKCB0eXBlID09IENGR19QUk9EX0RBVEEgKSB7ICAvL29ubHkgbmVlZGVkIGZvciBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgpoY2ZfaW8JCWlvX3BvcnQ7CndjaV9idWZwCXB0OwkJCQkJLy9wb2ludGVyIHdpdGggdGhlICJyaWdodCIgdHlwZSwganVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQoJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKFBMVUdfREFUQV9PRkZTRVQgPj4gNykgKTsKCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKFBMVUdfREFUQV9PRkZTRVQgJiAweDdFKSApOwoJCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfQVVYX0RBVEE7CQkvL3RvIHByZXZlbnQgc2lkZSBlZmZlY3RzIG9mIHRoZSBNU0YtZGVmaW5lZCBtYWNybwoJCQlwID0gbHR2cC0+dmFsOwkJCQkJLy9kZXN0aW5hdGlvbiBjaGFyIHBvaW50ZXIgKGluIExUViByZWNvcmQpCgkJCWkgPSBsZW4gLSAxOwoJCQlpZiAoaSA+IDAgKSB7CgkJCQlwdCA9ICh3Y2lfYnVmcClwOwkvL2p1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHB0LCBpICk7IC8vc3BhY2UgdXNlZCBieSBUOiAtMQoJCQl9CgkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfQ01EX0hDRiApIHsKI2RlZmluZSBQICgoQ0ZHX0NNRF9IQ0ZfU1RSQ1QgRkFSICopbHR2cCkKCQkJSENGQVNTRVJUKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUywgUC0+Y21kICkJCS8vb25seSBIZXJtZXMgcmVnaXN0ZXIgYWNjZXNzIHN1cHBvcnRlZAoJCQlpZiAoIFAtPmNtZCA9PSBDRkdfQ01EX0hDRl9SRUdfQUNDRVNTICkgewoJCQkJSENGQVNTRVJUKCBQLT5tb2RlIDwgaWZicC0+SUZCX0lPQmFzZSwgUC0+bW9kZSApCQkvL0NoZWNrIFJlZ2lzdGVyIHNwYWNlCgkJCQlsdHZwLT5sZW4gPSBtaW4oIGxlbiwgNCApOwkJCQkJCQkJLy9SRVNUT1JFIGx0diBsZW5ndGgKCQkJCVAtPmFkZF9pbmZvID0gSVBXKCBQLT5tb2RlICk7CgkJCX0KI3VuZGVmIFAKI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUwojaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ0ZHX0ZXX1BSSU5URikgewogICAgICAgICAgIHJjID0gZndfcHJpbnRmKGlmYnAsIChDRkdfRldfUFJJTlRGX1NUUkNUKilsdHZwKTsKI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCgkJfSBlbHNlIGlmICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApIHsKLy87PyBieSB1c2luZyBIQ01EX0JVU1kgb3B0aW9uIHdoZW4gY2FsbGluZyBjbWRfZXhlLCB1c2luZyBhIGdldF9mcmFnIHdpdGggbGVuZ3RoIDAganVzdCB0byBzZXQgdXAgdGhlCi8vOz8gQkFQIGFuZCBjYWxsaW5nIGNtZF9jbXBsLCB5b3UgY291bGQgbWVyZ2UgdGhlIDIgQnVzeSB3YWl0cy4gV2hldGhlciB0aGlzIHJlYWxseSBoZWxwcyAoYW5kIHdoYXQKLy87PyB3b3VsZCBiZSB0aGUgb3B0aW1hbCBzZXF1ZW5jZSBpbiBjbWRfZXhlIGFuZCBnZXRfZnJhZykgd291bGQgaGF2ZSB0byBiZSBNRUFTVVJFRAovKjE3Ki8JCWlmICggKCByYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTLCB0eXBlICkgKSA9PSBIQ0ZfU1VDQ0VTUyAmJgoJCQkJICggcmMgPSBzZXR1cF9iYXAoIGlmYnAsIHR5cGUsIDAsIElPX0lOICkgKSA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJmx0dnAtPmxlbiwgMipsZW4rMiBCRV9QQVIoMikgKTsKCQkJCWlmICggSVBXKCBIUkVHX1NUQVQgKSA9PSAweEZGRkYgKSB7CQkJCQkvL05JQyByZW1vdmFsIHRlc3QKCQkJCQlsdHZwLT5sZW4gPSAwOwoJCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICkKCQkJCX0KCQkJfQovKjEyKi8JfSBlbHNlIEhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICkgLypOT1AqLzsgLy9OT1AgaW4gY2FzZSBIQ0ZBU1NFUlQgaXMgZHVtbXkKCX0KCWlmICggbGVuIDwgbHR2cC0+bGVuICkgewoJCWx0dnAtPmxlbiA9IGxlbjsKCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQlyYyA9IEhDRl9FUlJfTEVOOwoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MgfHwgKCByYyA9PSBIQ0ZfRVJSX0xFTiAmJiBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDxIQ0ZfVFJBQ0VfUFVUX0lORk8gKSwKCQkJICAgTUVSR0VfMiggdHlwZSwgcmMgKSApCQkJCQkJCQkJCQkJCQkJCS8qMjAqLwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0dFVF9JTkZPICkKCXJldHVybiByYzsKfSAvLyBoY2ZfZ2V0X2luZm8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKi5QVVJQT1NFCQlUcmFuc2ZlcnMgb3BlcmF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHRvIHRoZSBDYXJkIGFuZCB0byB0aGUgSENGLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJc3BlY2lmaWVzIHRoZSBSSUQgKGFzIGRlZmluZWQgYnkgSGVybWVzIEkvRikgb3IgcHNldWRvLVJJRCAoYXMgZGVmaW5lZCBieSBXQ0kpCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKiEhCXZpYSBjbWRfZXhlCioJSENGX0VSUl9OT19OSUMgCQlOSUMgcmVtb3ZlZCBkdXJpbmcgZGF0YSByZXRyaWV2YWwKKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEYvVyBldmVudCBkaWQgbm90IG9jY3VyIGluIHRpbWUKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCiohIQl2aWEgZG93bmxvYWQJCQkJQ0ZHX0RMTlZfU1RBUlQgPD0gdHlwZSA8PSBDRkdfRExfU1RPUAoqISEJdmlhIHB1dF9pbmZvCQkJCUNGR19SSURfQ0ZHX01JTiA8PSB0eXBlIDw9IENGR19SSURfQ0ZHX01BWAoqISEJdmlhIHB1dF9mcmFnCioKKi5ERVNDUklQVElPTgoqIFRoZSBMLWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKiBUaGUgTC12YWx1ZSBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZC4KKiBUaGUgVC0gZmllbGQgc3BlY2lmaWVzIHRoZSBSSUQgcGxhY2VkIGluIHRoZSBWLWZpZWxkIGJ5IHRoZSBNU0YuCioKKiBOb3QgYWxsIENGRy1jb2RlcyBjYW4gYmUgdXNlZCBmb3IgaGNmX3B1dF9pbmZvLiAgVGhlIGZvbGxvd2luZyBDRkctY29kZXMgYXJlIHZhbGlkIGZvciBoY2ZfcHV0X2luZm86CiogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMiCiogQ2hhbmdlcyBtYWRlIGJ5IGhjZl9wdXRfaW5mbyB0byBDRkdfY29kZXMgaW4gdGhpcyBncm91cCB3aWxsIG5vdCBhZmZlY3QgdGhlIEYvVwoqIGFuZCBIQ0YgYmVoYXZpb3IgdW50aWwgaGNmX2NudGxfcG9ydCggSENGX1BPUlRfRU5BQkxFKSBpcyBjYWxsZWQuCiogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgoqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIHdpbGwgYWZmZWN0IHRoZSBGL1cgYW5kIEhDRiBiZWhhdmlvciBpbW1lZGlhdGVseS4KKiBvIENGR19QUk9HLgoqIFRoaXMgY29kZSBpcyB1c2VkIHRvIGluaXRpYXRlIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgdG8gZG93bmxvYWQgZGF0YSBlaXRoZXIgdG8KKiB2b2xhdGlsZSBvciB0byBub24tdm9sYXRpbGUgUkFNIG9uIHRoZSBOSUMgYXMgd2VsbCBhcyBmb3IgdGhlIGFjdHVhbCBkb3dubG9hZC4KKiBvIENGRy1jb2RlcyByZWxhdGVkIHRvIHRoZSBIQ0YgYmVoYXZpb3IuCiogVGhlIHJlbGF0ZWQgQ0ZHLWNvZGVzIGFyZToKKiAgLSBDRkdfUkVHX01CCiogIC0gQ0ZHX1JFR19BU1NFUlRfUlROUAoqICAtIENGR19SRUdfSU5GT19MT0cKKiAgLSBDRkdfQ01EX05JQwoqICAtIENGR19DTURfRE9OR0xFCiogIC0gQ0ZHX0NNRF9IQ0YKKiAgLSBDRkdfTk9USUZZCioKKiBBbGwgTFRWLXJlY29yZHMgInVua25vd24iIHRvIHRoZSBIQ0YgYXJlIGZvcndhcmRlZCB0byB0aGUgRi9XLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgoqIC0gaGNmX3B1dF9pbmZvIHdhcyBjYWxsZWQgd2l0aG91dCBwcmlvciBjYWxsIHRvIGhjZl9jb25uZWN0CiogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQsIGkuZS4gbmVpdGhlciBIQ0Ygbm9yIEYvVyBjYW4gaGFuZGxlIHRoZSB2YWx1ZS4KKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyBsZXNzIHRoYW4gMSBvciBleGNlZWRzIE1BWF9MVFZfU0laRS4KKiAtIHJlZ2lzdGVyaW5nIGEgTWFpbEJveCB3aXRoIHNpemUgbGVzcyB0aGFuIDYwIG9yIGEgbm9uLWFsaWduZWQgYnVmZmVyIGFkZHJlc3MgaXMgdXNlZC4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdAoqCU5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqCVJlbWFya3M6ICBJbiBjYXNlIG9mIEhlcm1lcyBDb25maWd1cmF0aW9uIExUVnMsIHRoZSBjb2RlcyBmb3IgdGhlIHR5cGUgYXJlICJjbGV2ZXJseSIgY2hvc2VuIHRvIGJlCioJaWRlbnRpY2FsIHRvIHRoZSBSSUQuIEhlcm1lcyBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBpbnRvIHRoZQoqCUNhcmQuCioJSW4gY2FzZSBvZiBIQ0YgQ29uZmlndXJhdGlvbiBMVFZzLCB0aGUgdHlwZSB2YWx1ZXMgYXJlIGNob3NlbiBpbiBhIHJhbmdlIHdoaWNoIGRvZXMgbm90IG92ZXJsYXAgdGhlCioJUklELXJhbmdlLgoqCioyMDoKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCmludApoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKewppbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1BVVF9JTkZPLCBsdHZwLT50eXAgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBsdHZwLCAwICkKCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBsdHZwLT5sZW4gKQoKCQkJCQkJCQkJCQkvL2FsbCBjb2RlcyBiZXR3ZWVuIDB4RkEwMCBhbmQgMHhGQ0ZGIGFyZSBwYXNzZWQgdG8gSGVybWVzCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiB7CWhjZl8xNiBpOwoJaGNmXzMyIEZBUiAqIGtleV9wOwoKCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB8fCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgKSB7CgkJa2V5X3AgPSAoaGNmXzMyKikoKENGR19BRERfVEtJUF9NQVBQRURfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50eF9taWNfa2V5OwoJCWkgPSBUWF9LRVk7CQkvL2kuZS4gVHhLZXlJbmRpY2F0b3IgPT0gMSwgS2V5SUQgPT0gMAoJCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSApIHsKCQkJa2V5X3AgPSAoaGNmXzMyKikoKENGR19BRERfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKCQkJaSA9IENOVl9MSVRUTEVfVE9fU0hPUlQoKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnRraXBfa2V5X2lkX2luZm8pOwoJCX0KCQlpZiAoIGkgJiBUWF9LRVkgKSB7CS8qIFR4S2V5SW5kaWNhdG9yID09IDEKCQkJCQkJCSAgIChlaXRoZXIgcmVhbGx5IHNldCBieSBNU0YgaW4gY2FzZSBvZiBERUZBVUxUIG9yIGZha2VkIGJ5IEhDRiBpbiBjYXNlIG9mIE1BUFBFRCApICovCgkJCWlmYnAtPklGQl9NSUNUeENudGwgPSAoaGNmXzE2KSggSEZTX1RYX0NOVExfTUlDIHwgKGkgJiBLRVlfSUQgKTw8OCApOwoJCQlpZmJwLT5JRkJfTUlDVHhLZXlbMF0gPSBDTlZfTE9OR1BfVE9fTElUVExFKCBrZXlfcCApOwoJCQlpZmJwLT5JRkJfTUlDVHhLZXlbMV0gPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMSkgKTsKCQl9CgkJaSA9ICggaSAmIEtFWV9JRCApICogMjsKCQlpZmJwLT5JRkJfTUlDUnhLZXlbaV0gICA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsyKSApOwoJCWlmYnAtPklGQl9NSUNSeEtleVtpKzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzMpICk7Cgl9CiNkZWZpbmUgUCAoKENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKQoJaWYgKCAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSApCXx8CgkJICggbHR2cC0+dHlwID09IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSAmJgoJCSAgICggKGlmYnAtPklGQl9NSUNUeENudGwgPj4gOCkgJiBLRVlfSUQgKSA9PSBDTlZfU0hPUlRfVE9fTElUVExFKFAtPnRraXBfa2V5X2lkICkKCQkgKQoJCSkgeyBpZmJwLT5JRkJfTUlDVHhDbnRsID0gMDsgfQkJLy9kaXNhYmxlIE1JQy1lbmdpbmUKI3VuZGVmIFAKIH0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoKCWlmICggbHR2cC0+dHlwID09IENGR19QUk9HICkgewoJCXJjID0gZG93bmxvYWQoIGlmYnAsIChDRkdfUFJPR19TVFJDVCBGQVIgKilsdHZwICk7Cgl9IGVsc2Ugc3dpdGNoIChsdHZwLT50eXApIHsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgoJICBjYXNlIENGR19SRUdfQVNTRVJUX1JUTlA6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIE1TRiBSb3V0aW5lcwojZGVmaW5lIFAgKChDRkdfUkVHX0FTU0VSVF9SVE5QX1NUUkNUIEZBUiAqKWx0dnApCgkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IFAtPnJ0bnA7Ci8vCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gUC0+bHZsOwkJLy9UT0RPIG5vdCB5ZXQgc3VwcG9ydGVkIHNvIGRlZmF1bHQgaXMgc2V0IGluIGhjZl9jb25uZWN0CgkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIEhDRl9BU1NFUlQsIDB4Q0FGMSApICkJLy9qdXN0IHRvIHByb29mIHRoYXQgdGhlIGNvbXBsZXRlIGFzc2VydCBtYWNoaW5lcnkgaXMgd29ya2luZwojdW5kZWYgUAoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCgkgIGNhc2UgQ0ZHX1JFR19JTkZPX0xPRzoJCQkJCQkJCQkJCS8vUmVnaXN0ZXIgTG9nIGZpbHRlcgoJCWlmYnAtPklGQl9SSURMb2dwID0gKChDRkdfUklEX0xPR19TVFJDVCBGQVIqKWx0dnApLT5yZWNvcmRwOwoJCWJyZWFrOwojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoJICBjYXNlIENGR19DTlRMX09QVDoJCQkJCQkJCQkJCQkvL292ZXJydWxlIG9wdGlvbgoJCUhDRkFTU0VSVCggKCBsdHZwLT52YWxbMF0gJiB+KFVTRV9ETUEgfCBVU0VfMTZCSVQpICkgPT0gMCwgbHR2cC0+dmFsWzBdICkKCQlpZiAoICggbHR2cC0+dmFsWzBdICYgVVNFX0RNQSApID09IDAgKSBpZmJwLT5JRkJfQ250bE9wdCAmPSB+VVNFX0RNQTsKCQlpZmJwLT5JRkJfQ250bE9wdCB8PSAgbHR2cC0+dmFsWzBdICYgVVNFXzE2QklUOwoJCWJyZWFrOwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgoJICBjYXNlIENGR19SRUdfTUI6CQkJCQkJCQkJCQkJCS8vUmVnaXN0ZXIgTWFpbEJveAojZGVmaW5lIFAgKChDRkdfUkVHX01CX1NUUkNUIEZBUiAqKWx0dnApCgkJSENGQVNTRVJUKCAoIChoY2ZfMzIpUC0+bWJfYWRkciAmIDB4MDAwMSApID09IDAsIChoY2ZfMzIpUC0+bWJfYWRkciApCgkJSENGQVNTRVJUKCAoUCktPm1iX3NpemUgPj0gNjAsIChQKS0+bWJfc2l6ZSApCgkJaWZicC0+SUZCX01CcCA9IFAtPm1iX2FkZHI7CgkJLyogaWYgbm8gTUIgcHJlc2VudCwgc2l6ZSBtdXN0IGJlIDAgZm9yIDs/dGhlIG9sZDs/IHB1dF9pbmZvX21iIHRvIHdvcmsgY29ycmVjdGx5ICovCgkJaWZicC0+SUZCX01CU2l6ZSA9IGlmYnAtPklGQl9NQnAgPT0gTlVMTCA/IDAgOiBQLT5tYl9zaXplOwoJCWlmYnAtPklGQl9NQldwID0gaWZicC0+SUZCX01CUnAJPSAwOwoJCWlmYnAtPklGQl9NQnBbMF0gPSAwOwkJCQkJCQkJCQkJLy9mbGFnIHRoZSBNYWlsQm94IGFzIGVtcHR5CgkJaWZicC0+SUZCX01CSW5mb0xlbiA9IDA7CgkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplID49IDYwIHx8IGlmYnAtPklGQl9NQnAgPT0gTlVMTCwgaWZicC0+SUZCX01CU2l6ZSApCiN1bmRlZiBQCgkJYnJlYWs7CgkgIGNhc2UgQ0ZHX01CX0lORk86CQkJCQkJCQkJCQkJCS8vc3RvcmUgTWFpbEJveEluZm9CbG9jawoJCXJjID0gcHV0X2luZm9fbWIoIGlmYnAsIChDRkdfTUJfSU5GT19TVFJDVCBGQVIgKilsdHZwICk7CgkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfRVhUX01CCgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCgkgIGNhc2UgQ0ZHX0NNRF9OSUM6CiNkZWZpbmUgUCAoKENGR19DTURfTklDX1NUUkNUIEZBUiAqKWx0dnApCgkJT1BXKCBIUkVHX1BBUkFNXzIsIFAtPnBhcm0yICk7CgkJT1BXKCBIUkVHX1BBUkFNXzEsIFAtPnBhcm0xICk7CgkJcmMgPSBjbWRfZXhlKCBpZmJwLCBQLT5jbWQsIFAtPnBhcm0wICk7CgkJUC0+aGNmX3N0YXQgPSAoaGNmXzE2KXJjOwoJCVAtPnN0YXQgPSBJUFcoIEhSRUdfU1RBVCApOwoJCVAtPnJlc3AwID0gSVBXKCBIUkVHX1JFU1BfMCApOwoJCVAtPnJlc3AxID0gSVBXKCBIUkVHX1JFU1BfMSApOwoJCVAtPnJlc3AyID0gSVBXKCBIUkVHX1JFU1BfMiApOwoJCVAtPmlmYl9lcnJfY21kID0gaWZicC0+SUZCX0VyckNtZDsKCQlQLT5pZmJfZXJyX3F1YWxpZmllciA9IGlmYnAtPklGQl9FcnJRdWFsaWZpZXI7CiN1bmRlZiBQCgkJYnJlYWs7CgkgIGNhc2UgQ0ZHX0NNRF9IQ0Y6CiNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCgkJSENGQVNTRVJUKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUywgUC0+Y21kICkJCS8vb25seSBIZXJtZXMgcmVnaXN0ZXIgYWNjZXNzIHN1cHBvcnRlZAoJCWlmICggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MgKSB7CgkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQoJCQlPUFcoIFAtPm1vZGUsIFAtPmFkZF9pbmZvKTsKCQl9CiN1bmRlZiBQCgkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfRVhUX05JQ19BQ0NFU1MKCiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgogICAgICBjYXNlIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OOgogICAgICAgIGlmYnAtPklGQl9Gd1BmQnVmZiA9ICooQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QqKWx0dnA7CiAgICAgICAgYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgoKCSAgZGVmYXVsdDoJCQkJCQkvL3Bhc3MgZXZlcnl0aGluZyB1bmtub3duIGFib3ZlIHRoZSAiRklEIiByYW5nZSB0byB0aGUgSGVybWVzIG9yIERvbmdsZQoJCXJjID0gcHV0X2luZm8oIGlmYnAsIGx0dnAgKTsKCX0KCS8vRE8gTk9UICEhISBIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCQkJCQkJCQkJCQkJLyogMjAgKi8KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9QVVRfSU5GTyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX3B1dF9pbmZvCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCiouUFVSUE9TRQkJQWxsOiBkZWNhcHN1bGF0ZSBhIG1lc3NhZ2UuCioJCQkJcHJlLUhlcm1lc0lJLjU6IHZlcmlmeSBNSUMuCioJCQkJbm9uLVVTQiwgbm9uLURNQSBtb2RlOiBUcmFuc2ZlciBhIG1lc3NhZ2UgZnJvbSB0aGUgTklDIHRvIHRoZSBIb3N0IGFuZCBhY2tub3dsZWRnZSByZWNlcHRpb24uCioJCQkJVVNCOiBUcmFuc2Zvcm0gYSBtZXNzYWdlIGZyb20gcHJvcHJpZXRhcnkgVVNCIGZvcm1hdCB0byA4MDIuMyBmb3JtYXQKKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlQb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yIExpc3QgbG9jYXRpb24uCioJb2Zmc2V0CQlVU0I6IG5vdCB1c2VkCioJCQkJbm9uLVVTQjogc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgdG8gYmUgb2J0YWluZWQgKDAgY29ycmVzcG9uZHMgd2l0aCBEZXN0QWRkciBmaWVsZAoqCQkJCW9mIGZyYW1lKS4KKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwkJCU5vIFNTTiBlcnJvciAoIG9yIEhDRl9FUlJfTUlDIGFscmVhZHkgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQoqCUhDRl9FUlJfTUlDCQkJbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDICggSENGX1NVQ0NFU1MgaXMgcmVwb3J0ZWQgaWYgSENGX0VSUl9NSUMgaXMgYWxyZWFkeQoqCQkJCQkJcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQoqIAlIQ0ZfRVJSX05PX05JQwkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCiogCUhDRl9FUlJfREVGVU5DVC4uLgoqCiouREVTQ1JJUFRJT04KKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNhbiBiZSBleGVjdXRlZCBieSB0aGUgTVNGIHRvIG9idGFpbiB0aGUgRGF0YSBJbmZvIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSB0aGF0CiogaXMgcmVwb3J0ZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbi4KKgoqIFRoZSBSZWNlaXZlIE1lc3NhZ2UgRnVuY3Rpb24gY29waWVzIHRoZSBtZXNzYWdlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBDYXJkIG1lbW9yeSBpbnRvIGEgYnVmZmVyIHN0cnVjdHVyZQoqIHByb3ZpZGVkIGJ5IHRoZSBNU0YuCiogT25seSBkYXRhIG9mIHRoZSBtZXNzYWdlIGluZGljYXRlZCBieSB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gY2FuIGJlIG9idGFpbmVkLgoqIEV4ZWN1dGlvbiBvZiB0aGUgU2VydmljZSBOSUMgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbmV3IG1lc3NhZ2UsIGJ1dCBpdCBkZWZpbml0ZWx5CiogbWFrZXMgdGhlIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIHByZWNlZGluZyBTZXJ2aWNlIE5JQyBmdW5jdGlvbiwgdW5hdmFpbGFibGUuCioKKiBpbiBub24tVVNCL25vbi1ETUEgbW9kZSwgaGNmX3Jjdl9tc2cgc3RhcnRzIHRoZSBjb3B5IHByb2Nlc3MgYXQgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCByZXF1ZXN0ZWQgYnkgdGhlCiogcGFyYW1ldGVyIG9mZnNldCwgcmVsYXRpdmUgdG8gSEZTX0FERFJfREVTVCwgZS5nIG9mZnNldCAwIHN0YXJ0cyBjb3B5aW5nIGZyb20gdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIHRoZQoqIHZlcnkgYmVnaW4gb2YgdGhlIDgwMi4zIGZyYW1lIG1lc3NhZ2UuIE9mZnNldCBtdXN0IGVpdGhlciBsYXkgd2l0aGluIHRoZSBwYXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcyBzdG9yZWQKKiBieSBoY2Zfc2VydmljZV9uaWMgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIgb3IgYmUganVzdCBiZWhpbmQgaXQsIGkuZS4gdGhlIGZpcnN0IGJ5dGUgbm90IHlldCByZWFkLgoqIFdoZW4gb2Zmc2V0IGlzIHdpdGhpbiBsb29rYWhlYWQsIGRhdGEgaXMgY29waWVkIGZyb20gbG9va2FoZWFkLgoqIFdoZW4gb2Zmc2V0IGlzIGJleW9uZCBsb29rYWhlYWQsIGRhdGEgaXMgcmVhZCBkaXJlY3RseSBmcm9tIFJ4RlMgaW4gTklDIHdpdGggZGlzcmVnYXJkIG9mIHRoZSBhY3R1YWwgdmFsdWUKKiBvZiBvZmZzZXQKKgoqLk5PVElDRToKKiBvIGF0IGVudHJ5OiBsb29rIGFoZWFkIGJ1ZmZlciBhcyBwYXNzZWQgd2l0aCBoY2Zfc2VydmljZV9uaWMgaXMgc3RpbGwgYWNjZXNzaWJsZSBhbmQgdW5jaGFuZ2VkCiogbyBhdCBleGl0OiBSZWNlaXZlIEZyYW1lIGluIE5JQyBtZW1vcnkgaXMgcmVsZWFzZWQKKgoqIERlc2NyaXB0aW9uOgoqIFN0YXJ0aW5nIGF0IHRoZSBieXRlIGluZGljYXRlZCBieSB0aGUgT2Zmc2V0IHZhbHVlLCB0aGUgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBEYXRhIEluZm8KKiBQYXJ0IG9mIHRoZSBjdXJyZW50IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIHRvIHRoZSBIb3N0IG1lbW9yeSBkYXRhIGJ1ZmZlciBzdHJ1Y3R1cmUKKiBpZGVudGlmaWVkIGJ5IGRlc2NwLgoqIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBPZmZzZXQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHRoZSA4MDIuMyBmcmFtZSByZWFkIGludG8gdGhlCiogbG9vayBhaGVhZCBidWZmZXIgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBzaXplIG1pbnVzCiogQ29udHJvbCBhbmQgODAyLjExIGZpZWxkcykKKiBJZiBPZmZzZXQgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCBjb3B5aW5nIHN0YXJ0cyBmcm9tIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciB0aWxsIHRoZQoqIGVuZCBvZiB0aGF0IGJ1ZmZlciBpcyByZWFjaGVkCiogVGhlbiAob3IgaWYgdGhlIG1heGltdW0gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBPZmZzZXQpLCB0aGUKKiBtZXNzYWdlIGlzIGRpcmVjdGx5IGNvcGllZCBmcm9tIE5JQyBtZW1vcnkgdG8gSG9zdCBtZW1vcnkuCiogSWYgYW4gaW52YWxpZCAoaS5lLiB0b28gbGFyZ2UpIG9mZnNldCBpcyBzcGVjaWZpZWQsIGFuIGFzc2VydCBjYXRjaGVzIGJ1dCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZQoqIHVuZGVmaW5lZC4KKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlcjoKKiBvIHRoZSBlbmQgb2YgdGhlIDgwMi4zIGZyYW1lIGlzIHJlYWNoZWQKKiBvIHRoZSBEZXNjcmlwdG9yIHdpdGggYSBOVUxMIHBvaW50ZXIgaW4gdGhlIG5leHRfZGVzY19hZGRyIGZpZWxkIGlzIHJlYWNoZWQKKgoqIFdoZW4gdGhlIGNvcHlpbmcgc3RvcHMsIHRoZSByZWNlaXZlciBpcyBhY2snZWQsIHRodXMgZnJlZWluZyB0aGUgTklDIG1lbW9yeSB3aGVyZSB0aGUgZnJhbWUgaXMgc3RvcmVkCiogQXMgYSBjb25zZXF1ZW5jZSwgaGNmX3Jjdl9tc2cgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIGFueSBwYXJ0aWN1bGFyIFJ4IGZyYW1lLgoqCiogRm9yIHRoZSB0aW1lIGJlaW5nIChQQ0kgQnVzIG1hc3RlcmluZyBub3QgeWV0IHN1cHBvcnRlZCksIG9ubHkgdGhlIGZvbGxvd2luZyBmaWVsZHMgb2YgZWFjaAoqIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CiogbyBidWZfY250bC5idWZfZGltWzFdCiogbyAqbmV4dF9kZXNjX2FkZHIKKiBvICpidWZfYWRkcgoqIEF0IHJldHVybiBmcm9tIGhjZl9yY3ZfbXNnLCB0aGUgZmllbGQgYnVmX2NudGwuYnVmX2RpbVswXSBvZiB0aGUgdXNlZCBEZXNjcmlwdG9ycyByZWZsZWN0cwoqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIERlc2NyaXB0b3IuCiogT24gdGhlIGxhc3QgdXNlZCBEZXNjcmlwdG9yLCBidWZfY250bC5idWZfZGltWzBdIGlzIGxlc3Mgb3IgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KKiBPbiBhbGwgcHJlY2VkaW5nIERlc2NyaXB0b3JzIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KKiBPbiBhbGwgc3VjY2VlZGluZyAodW51c2VkKSBEZXNjcmlwdG9ycywgYnVmX2NudGwuYnVmX2RpbVswXSBpcyB6ZXJvLgoqIE5vdGU6IHRoaXMgSS9GIGlzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9ucyBob3cgdGhlIEkvRiBuZWVkZWQgZm9yIFBDSSBCdXMgbWFzdGVyaW5nIHdpbGwKKiBiZSwgc28gaXQgbWF5IGNoYW5nZS4KKgoqIFRoZSBtb3N0IGxpa2VseSBoYW5kbGluZyBvZiBIQ0ZfRVJSX05PX05JQyBieSB0aGUgTVNGIGlzIHRvIGRyb3AgdGhlIGFscmVhZHkgY29waWVkCiogZGF0YSBhcyBlbGVnYW50bHkgYXMgcG9zc2libGUgdW5kZXIgdGhlIGNvbnN0cmFpbnRzIGFuZCByZXF1aXJlbWVudHMgcG9zZWQgYnkgdGhlIChOKU9TLgoqIElmIG5vIHJlY2VpdmVkIEZyYW1lIFN0cnVjdHVyZSBpcyBwZW5kaW5nLCAiU3VjY2VzcyIgcmF0aGVyIHRoYW4gIlJlYWQgZXJyb3IiIGlzIHJldHVybmVkLgoqIFRoaXMgZXJyb3IgY29uc3RpdHV0ZXMgYSBsb2dpYyBmbGF3IGluIHRoZSBNU0YKKiBUaGUgSENGIGNhbiBvbmx5IGNhdGNoIGEgbWlub3JpdHkgb2YgdGhpcwoqIHR5cGUgb2YgZXJyb3JzCiogQmFzZWQgb24gY29uc2lzdGVuY3kgaWRlYXMsIHRoZSBIQ0YgY2F0Y2hlcyBub25lIG9mIHRoZXNlIGVycm9ycy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlCiogLSB0aGVyZSBpcyBubyB1bmFja25vd2xlZGdlZCBSeC1tZXNzYWdlIGF2YWlsYWJsZQoqIC0gb2Zmc2V0IGlzIG91dCBvZiByYW5nZSAob3V0c2lkZSBsb29rIGFoZWFkIGJ1ZmZlcikKKiAtIGRlc2NwIGlzIGEgTlVMTCBwb2ludGVyCiogLSBhbnkgb2YgdGhlIGRlc2NyaXB0b3JzIGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCiogCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqIC0gYnkgdXNpbmcgdW5zaWduZWQgaW50IGFzIHR5cGUgZm9yIG9mZnNldCwgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBuZWdhdGl2ZSBvZmZzZXRzCiogLSBBc3NlcnRpbmcgb24gYmVpbmcgZW5hYmxlZC9wcmVzZW50IGlzIHN1cGVyZmx1b3VzLCBzaW5jZSBhIG5vbi16ZXJvIElGQl9sYWwgaW1wbGllcyB0aGF0IGhjZl9zZXJ2aWNlX25pYwoqICAgd2FzIGNhbGxlZCBhbmQgZGV0ZWN0ZWQgYSBSeC1tZXNzYWdlLiBBIHplcm8gSUZCX2xhbCB3aWxsIHNldCB0aGUgQlVGX0NOVCBmaWVsZCBvZiBhdCBsZWFzdCB0aGUgZmlyc3QKKiAgIGRlc2NyaXB0b3IgdG8gemVyby4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmhjZl9yY3ZfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkKewppbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwp3Y2lfYnVmcAljcDsJCQkJCQkJCQkJLy9jaGFyIG9yaWVudGVkIHdvcmtpbmcgcG9pbnRlcgpoY2ZfMTYJCWk7CmludAkJCXRvdF9sZW4gPSBpZmJwLT5JRkJfUnhMZW4gLSBvZmZzZXQ7CQkvL3RvdGFsIGxlbmd0aAp3Y2lfYnVmcAlsYXAgPSBpZmJwLT5JRkJfbGFwICsgb2Zmc2V0OwkJCS8vc3RhcnQgYWRkcmVzcyBpbiBMb29rQWhlYWQgQnVmZmVyCmhjZl8xNgkJbGFsID0gaWZicC0+SUZCX2xhbCAtIG9mZnNldDsJCQkvL2F2YWlsYWJsZSBkYXRhIHdpdGhpbiBMb29rQWhlYWQgQnVmZmVyCmhjZl8xNgkJajsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1JDVl9NU0csIG9mZnNldCApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCglIQ0ZBU1NFUlQoIGRlc2NwLCBIQ0ZfVFJBQ0VfUkNWX01TRyApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeExlbiwgSENGX1RSQUNFX1JDVl9NU0cgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4gPj0gb2Zmc2V0LCBNRVJHRV8yKCBvZmZzZXQsIGlmYnAtPklGQl9SeExlbiApICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX2xhbCA+PSBvZmZzZXQsIG9mZnNldCApCglIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQSApCgoJaWYgKCB0b3RfbGVuIDwgMCApIHsKCQlsYWwgPSAwOyB0b3RfbGVuID0gMDsJCQkJLy9zdXBwcmVzcyBhbGwgY29weWluZyBhY3Rpdml0eSBpbiB0aGUgZG8tLXdoaWxlIGxvb3AKCX0KCWRvIHsJCQkJCQkJCQkvL2xvb3Agb3ZlciBhbGwgYXZhaWxhYmxlIGZyYWdtZW50cwoJCS8vIG9ibm94aW91cyBoY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlcgoJCUhDRkFTU0VSVCggKChoY2ZfMzIpZGVzY3AgJiAzICkgPT0gMCwgKGhjZl8zMilkZXNjcCApCgkJY3AgPSBkZXNjcC0+YnVmX2FkZHI7CgkJaiA9IG1pbiggKGhjZl8xNil0b3RfbGVuLCBkZXNjcC0+QlVGX1NJWkUgKTsJLy9taW5pbXVtIG9mICJ3aGF0J3NgIGF2YWlsYWJsZSIgYW5kIGZyYWdtZW50IHNpemUKCQlkZXNjcC0+QlVGX0NOVCA9IGo7CgkJdG90X2xlbiAtPSBqOwkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCB0byBnbwoJCWlmICggbGFsICkgewkJCQkJCS8vaWYgbG9va2FoZWFkIEJ1ZmZlciBub3QgeWV0IGNvbXBsZXRlbHkgY29waWVkCgkJCWkgPSBtaW4oIGxhbCwgaiApOwkJCQkvL21pbmltdW0gb2YgIndoYXQncyBhdmFpbGFibGUiIGluIExvb2tBaGVhZCBhbmQgZnJhZ21lbnQgc2l6ZQoJCQlsYWwgLT0gaTsJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIExvb2tBaGVhZAoJCQlqIC09IGk7CQkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gY3VycmVudCBmcmFnbWVudAoJCQkvKjs/IHdoaWxlIGxvb3AgY291bGQgYmUgaW1wcm92ZWQgYnkgbW92aW5nIHdvcmRzIGJ1dCB0aGF0IGlzIGNvbXBsaWNhdGVkIG9uIHBsYXRmb3JtcyB3aXRoCgkJCSAqIGFsaWdubWVudCByZXF1aXJlbWVudHMqLwoJCQl3aGlsZSAoIGktLSApICpjcCsrID0gKmxhcCsrOwoJCX0KCQlpZiAoIGogKSB7CS8vaWYgTG9va0FoZWFkIEJ1ZmZlciBleGhhdXN0ZWQgYnV0IHN0aWxsIHNwYWNlIGluIGZyYWdtZW50LCBjb3B5IGRpcmVjdGx5IGZyb20gTklDIFJBTQoJCQlnZXRfZnJhZyggaWZicCwgY3AsIGogQkVfUEFSKDApICk7CgkJCUNBTENfUlhfTUlDKCBjcCwgaiApOwoJCX0KCX0gd2hpbGUgKCAoIGRlc2NwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoJaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CgkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsJCQkJLy9wcmV2ZW50cyBNSUMgZXJyb3IgcmVwb3J0IGlmIGhjZl9zZXJ2aWNlX25pYyBhbHJlYWR5IGNvbnN1bWVkIGFsbAoJfQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJLy9vbmx5IDEgc2hvdCB0byBnZXQgdGhlIGRhdGEsIHNvIGZyZWUgdGhlIHJlc291cmNlcyBpbiB0aGUgTklDCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfUkNWX01TRyApCglyZXR1cm4gcmM7Cn0gLy8gaGNmX3Jjdl9tc2cKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKKi5QVVJQT1NFCQlFbmNhcHN1bGF0ZSBhIG1lc3NhZ2UgYW5kIGFwcGVuZCBwYWRkaW5nIGFuZCBNSUMuCioJCQkJbm9uLVVTQjogVHJhbnNmZXJzIHRoZSByZXN1bHRpbmcgbWVzc2FnZSBmcm9tIEhvc3QgdG8gTklDIGFuZCBpbml0aWF0ZXMgdHJhbnNtaXNzaW9uLgoqCQkJCVVTQjogVHJhbnNmZXIgcmVzdWx0aW5nIG1lc3NhZ2UgaW50byBhIGZsYXQgYnVmZmVyLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJZGVzY3AJCXBvaW50ZXIgdG8gdGhlIERlc2NyaXB0b3JMaXN0IG9yIE5VTEwKKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKgkJCQkJSEZTX1RYX0NOVExfU1BFQ1RSQUxJTksKKgkJCQkJSEZTX1RYX0NOVExfUFJJTwoqCQkJCQlIRlNfVFhfQ05UTF9UWF9PSwoqCQkJCQlIRlNfVFhfQ05UTF9UWF9FWAoqCQkJCQlIRlNfVFhfQ05UTF9UWF9ERUxBWQoqCQkJCQlIRlNfVFhfQ05UTF9UWF9DT05UCioJCQkJCUhDRl9QT1JUXzAJCQkJIE1BQyBQb3J0IDAgKGRlZmF1bHQpCioJCQkJCUhDRl9QT1JUXzEgKEFQIG9ubHkpCSBNQUMgUG9ydCAxCioJCQkJCUhDRl9QT1JUXzIgKEFQIG9ubHkpCSBNQUMgUG9ydCAyCioJCQkJCUhDRl9QT1JUXzMgKEFQIG9ubHkpCSBNQUMgUG9ydCAzCioJCQkJCUhDRl9QT1JUXzQgKEFQIG9ubHkpCSBNQUMgUG9ydCA0CioJCQkJCUhDRl9QT1JUXzUgKEFQIG9ubHkpCSBNQUMgUG9ydCA1CioJCQkJCUhDRl9QT1JUXzYgKEFQIG9ubHkpCSBNQUMgUG9ydCA2CioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4KKglIQ0ZfRVJSX1RJTUVfT1VUCioKKi5ERVNDUklQVElPTjoKKiBUaGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGVtYm9kaWVzIDIgZnVuY3Rpb25zOgoqIG8gdHJhbnNmZXJzIGEgbWVzc2FnZSAoaW5jbHVkaW5nIE1BQyBoZWFkZXIpIGZyb20gdGhlIHByb3ZpZGVkIGJ1ZmZlciBzdHJ1Y3R1cmUgaW4gSG9zdCBtZW1vcnkgdG8gdGhlIFRyYW5zbWl0CiogRnJhbWUgU3RydWN0dXJlIChUeEZTKSBpbiBOSUMgbWVtb3J5LgoqIG8gSXNzdWUgYSBzZW5kIGNvbW1hbmQgdG8gdGhlIEYvVyB0byBhY3R1YWxseSB0cmFuc21pdCB0aGUgY29udGVudHMgb2YgdGhlIFR4RlMuCioKKiBDb250cm9sIGlzIGJhc2VkIG9uIHRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgSUZCX1JzY0luZC4KKiBUaGUgUmVzb3VyY2UgSW5kaWNhdG9yIGlzIG1haW50YWluZWQgYnkgdGhlIEhDRiBhbmQgc2hvdWxkIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYnV0IG5vdCBjaGFuZ2VkIGJ5IHRoZSBNU0YuCiogVGhlIE1TRiBtdXN0IGNoZWNrIElGQl9Sc2NJbmQgdG8gYmUgbm9uLXplcm8gYmVmb3JlIGV4ZWN1dGluZyB0aGUgY2FsbCB0byB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uLgoqIFdoZW4gbm8gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUsIHRoZSBNU0YgbXVzdCBoYW5kbGUgdGhlIHF1ZXVpbmcgb2YgdGhlIFRyYW5zbWl0IGZyYW1lIGFuZCBjaGVjayB0aGUKKiBSZXNvdXJjZSBJbmRpY2F0b3IgcGVyaW9kaWNhbGx5IGFmdGVyIGNhbGxpbmcgaGNmX3NlcnZpY2VfbmljLgoqCiogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbnMgdHJhbnNmZXJzIGEgbWVzc2FnZSB0byBOSUMgbWVtb3J5IHdoZW4gaXQgaXMgY2FsbGVkIHdpdGggYSBub24tTlVMTCBkZXNjcC4KKiBCZWZvcmUgdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBpcyBpbnZva2VkIHRoaXMgd2F5LCB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKSBtdXN0IGJlIGNoZWNrZWQuCiogSWYgdGhlIFJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUsIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBleGVjdXRpb24gbXVzdCBiZSBwb3N0cG9uZWQgdW50aWwgYWZ0ZXIgcHJvY2Vzc2luZyBvZgoqIGEgbmV4dCBoY2Zfc2VydmljZV9uaWMgaXQgYXBwZWFycyB0aGF0IHRoZSBSZXNvdXJjZSBoYXMgYmVjb21lIGF2YWlsYWJsZS4KKiBUaGUgbWVzc2FnZSBpcyBjb3BpZWQgZnJvbSB0aGUgYnVmZmVyIHN0cnVjdHVyZSBpZGVudGlmaWVkIGJ5IGRlc2NwIHRvIHRoZSBOSUMuCiogQ29weWluZyBzdG9wcyBpZiBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZC4KKiBIY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgYmVjYXVzZSB0aGUgRi9XIGRvZXMgdGhpcyBwcm90ZWN0aW9uLgoqIEluIGNhc2Ugb2YgYSB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIHRoZSBzdXJwbHVzIHdoaWNoIGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIHNpbXBseSBkcm9wcGVkLgoqCiogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBhY3RpdmF0ZXMgdGhlIEYvVyB0byBhY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBtZWRpdW0gd2hlbiB0aGUKKiBIRlNfVFhfQ05UTF9UWF9ERUxBWSBiaXQgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGlzIG5vdCBzZXQuCiogSWYgdGhlIGRlc2NwIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBjYWxsIGlzIG5vbi1OVUxMLCB0aGUgbWVzc2FnZSBhcyByZXByZXNlbnRlZCBieSBkZXNjcCBpcyBzZW5kLgoqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBOVUxMLCBhbmQgaWYgdGhlIHByZWNlZGluZyBjYWxsIG9mIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaGFkCiogYSBub24tTlVMTCBkZXNjcCBhbmQgdGhlIHByZWNlZGluZyBjYWxsIGhhZCB0aGUgSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHR4X2NudGwgc2V0LCB0aGVuIHRoZSBtZXNzYWdlIGFzCiogcmVwcmVzZW50ZWQgYnkgdGhlIGRlc2NwIG9mIHRoZSBwcmVjZWRpbmcgY2FsbCBpcyBzZW5kLgoqCiogSGNmX3NlbmRfbXNnIHN1cHBvcnRzIGVuY2Fwc3VsYXRpb24gKHNlZSBIQ0ZfRU5DQVApIG9mIEV0aGVybmV0LUlJIGZyYW1lcy4KKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgVHJhbnNtaXQgRnJhbWUgc3RydWN0dXJlIGFzIGFuIDgwMi4zIGZyYW1lLgoqIEhjZl9zZW5kX21zZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW4gODAyLjMgYW5kIGFuIEV0aGVybmV0LUlJIGZyYW1lIGJ5IGxvb2tpbmcgYXQgdGhlIGRhdGEgbGVuZ3RoL3R5cGUgZmllbGQKKiBvZiB0aGUgZnJhbWUuIElmIHRoaXMgZmllbGQgY29udGFpbnMgYSB2YWx1ZSBsYXJnZXIgdGhhbiAxNTE0LCB0aGUgZnJhbWUgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBFdGhlcm5ldC1JSQoqIGZyYW1lLCBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBhbiA4MDIuMyBmcmFtZS4KKiBUbyBlYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIQ0YsIHRoaXMgdHlwZS90eXBlIGZpZWxkIG11c3QgYmUgbG9jYXRlZCBpbiB0aGUgZmlyc3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUsCiogaS5lLiB0aGUgMXN0IGZyYWdtZW50IG11c3QgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgMTQgKHRvIGNvbnRhaW4gRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbi9UeXBlIGZpZWxkKS4KKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyBlbmNhcHN1bGF0ZWQgYnkgaW5zZXJ0aW5nIGEgU05BUCBoZWFkZXIgYmV0d2VlbiB0aGUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgdGhlCiogdHlwZSBmaWVsZC4gIFRoaXMgaW5zZXJ0aW9uIGlzIHRyYW5zcGFyZW50IGZvciB0aGUgTVNGLgoqIFRoZSBIQ0YgY29udGFpbnMgYSBmaXhlZCB0YWJsZSB0aGF0IHN0b3JlcyBhIG51bWJlciBvZiB0eXBlcy4gSWYgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdHlwZS90eXBlIGZpZWxkCiogb2NjdXJzIGluIHRoaXMgdGFibGUsIEJyaWRnZSBUdW5uZWwgRW5jYXBzdWxhdGlvbiBpcyB1c2VkLCBvdGhlcndpc2UgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIHVzZWQuCiogQnJpZGdlIFR1bm5lbCB1c2VzCUFBIEFBIDAzIDAwIDAwIEY4IGFzIFNOQVAgaGVhZGVyLAoqIFJGQzEwNDIgdXNlcwlBQSBBQSAwMyAwMCAwMCAwMCBhcyBTTkFQIGhlYWRlci4KKiBUaGUgdGFibGUgY3VycmVudGx5IGNvbnRhaW5zOgoqIDAgMHg4MEYzCUFwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCiogMCAweDgxMzcJSVBYCioKKiBUaGUgYWxnb3JpdGhtIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gODAyLjMgYW5kIEV0aGVybmV0LUlJIGZyYW1lcyBsaW1pdHMgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBmcmFtZXMgb2YKKiA4MDIuMyBmcmFtZXMgdG8gMTUxNCBieXRlcy4KKiBFbmNhcHN1bGF0aW9uIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IG1lYW5zIG9mIHRoZSBzeXN0ZW0gY29uc3RhbnQgSENGX0VOQ0FQLCBlLmcuIHRvIHN1cHBvcnQgcHJvcHJpZXRhcnkKKiBwcm90b2NvbHMgd2l0aCA4MDIuMyBsaWtlIGZyYW1lcyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiAxNTE0IGJ5dGVzLgoqCiogSW4gY2FzZSB0aGUgSENGIGVuY2Fwc3VsYXRlcyB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQoqIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzLgoqIEluIGNhc2UgdGhlIEhDRiBkb2VzIG5vdCBlbmNhcHN1bGF0ZSB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBub3QKKiBkZXRlcm1pbmVkIGJ5IHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltW0RFU0NfQ05UTF9DTlRdIGZpZWxkcyBvZiB0aGUgZGVzY19zdHJjdCdzIGJ1dCBieQoqIHRoZSBMZW5ndGggZmllbGQgb2YgdGhlIDgwMi4zIGZyYW1lLgoqIElmIHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbiB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVswXSBmaWVsZHMgYW5kIHRoZQoqIDgwMi4zIExlbmd0aCBmaWVsZCB0aGUgODAyLjMgTGVuZ3RoIGZpZWxkIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB0cmFuc21pdHRlZCBieSB0aGUgTklDIHdoaWxlCiogdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGRldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBNSUMsIGhlbmNlIGEgbWlzbWF0Y2gKKiB3aWxsIHJlc3VsdCBpbiBNSUMgZXJyb3JzIG9uIHRoZSBSZWNlaXZpbmcgc2lkZS4KKiBDdXJyZW50bHkgdGhpcyBwcm9ibGVtIGlzIGZsYWdnZWQgb24gdGhlIFRyYW5zbWl0IHNpZGUgYnkgYW4gQXNzZXJ0LgoqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2ggb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0KKiBvICpuZXh0X2Rlc2NfYWRkcgoqIG8gKmJ1Zl9hZGRyCioKKiBBbGwgYml0cyBvZiB0aGUgdHhfY250bCBwYXJhbWV0ZXIgZXhjZXB0IEhGU19UWF9DTlRMX1RYX0RFTEFZIGFuZCB0aGUgSENGX1BPUlQjIGJpdHMgYXJlIHBhc3NlZCB0byB0aGUgRi9XIHZpYQoqIHRoZSBIRlNfVFhfQ05UTCBmaWVsZCBvZiB0aGUgVHhGUy4KKgoqIE5vdGUgdGhhdCBoY2Zfc2VuZF9tc2cgZG9lcyBub3QgZGV0ZWN0IE5JQyBhYnNlbmNlLiAgVGhlIE1TRiBpcyBzdXBwb3NlZCB0byBoYXZlIGl0cyBvd24gLXBsYXRmb3JtIGRlcGVuZGVudC0KKiB3YXkgdG8gcmVjb2duaXplIGNhcmQgcmVtb3ZhbC9pbnNlcnRpb24uCiogVGhlIHRvdGFsIHN5c3RlbSBtdXN0IGJlIHJvYnVzdCBhZ2FpbnN0IGNhcmQgcmVtb3ZhbCBhbmQgdGhlcmUgaXMgbm8gcHJpbmNpcGFsIGRpZmZlcmVuY2UgYmV0d2VlbiBjYXJkIHJlbW92YWwKKiBqdXN0IGFmdGVyIGhjZl9zZW5kX21zZyByZXR1cm5zIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZSBvciBzb21ldGltZSBlYXJsaWVyLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKKiAtIGRlc2NwIGlzIGEgTlVMTCBwb2ludGVyCiogLSBubyByZXNvdXJjZXMgZm9yIFBJRiBhdmFpbGFibGUuCiogLSBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqCiouRElBR1JBTQoqNDoJZm9yIHRoZSBub3JtYWwgY2FzZSAoaS5lLiBubyBIRlNfVFhfQ05UTF9UWF9ERUxBWSBvcHRpb24gYWN0aXZlKSwgYSBmaWQgaXMgYWNxdWlyZWQgdmlhIHRoZQoqCXJvdXRpbmUgZ2V0X2ZpZC4gIElmIG5vIEZJRCBpcyBhY3F1aXJlZCwgdGhlIHJlbWFpbmRlciBpcyBza2lwcGVkIHdpdGhvdXQgYW4gZXJyb3Igbm90aWZpY2F0aW9uLiAgQWZ0ZXIKKglhbGwsIHRoZSBNU0YgaXMgbm90IHN1cHBvc2VkIHRvIGNhbGwgaGNmX3NlbmRfbXNnIHdoZW4gbm8gUmVzb3VyY2UgaXMgYXZhaWxhYmxlLgoqNzoJVGhlIENvbnRyb2xGaWVsZCBvZiB0aGUgVHhGUyBpcyB3cml0dGVuLiAgU2luY2UgcHV0X2ZyYWcgY2FuIG9ubHkgcmV0dXJuIHRoZSBmYXRhbCBEZWZ1bmN0IG9yICJObyBOSUMiLCB0aGUKKglyZXR1cm4gc3RhdHVzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2Ugd2hlbiBpdCBmYWlscywgY21kX3dhaXQgd2lsbCBmYWlsIGFzIHdlbGwuICAoc2VlIGFsc28gdGhlIG5vdGUgb24gdGhlCioJbmVlZCBmb3IgYSByZXR1cm4gY29kZSBiZWxvdykuCioJTm90ZSB0aGF0IEhGU19UWF9DTlRMIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGZvciBILUksIEgtSS9TU04gYW5kIEgtSUkgYW5kIEhGU19BRERSX0RFU1QgaGFzIGRpZmZlcmVudAoqCXZhbHVlcyBmb3IgSC1JIChyZWdhcmRsZXNzIG9mIFNTTikgYW5kIEgtSUkuCioJQnkgd3JpdGluZyAxNywgMSBvciAyICggaW1wbHlpbmcgMTYsIDAgb3IgMSBnYXJiYWdlIHdvcmQgYWZ0ZXIgSEZTX1RYX0NOVEwpIHRoZSBCQVAganVzdCBnZXRzIHRvCioJSEZTX0FERFJfREVTVCBmb3IgSC1JLCBILUkvU1NOIGFuZCBILUlJIHJlc3BlY3RpdmVseS4KKjEwOiBpZiBuZWl0aGVyIGVuY2Fwc3VsYXRpb24gbm9yIE1JQyBjYWxjdWxhdGlvbiBpcyBuZWVkZWQsIHNwbGl0dGluZyB0aGUgZmlyc3QgZnJhZ21lbnQgaW4gdHdvIGRvZXMgbm90CioJcmVhbGx5IGhlbHAgYnV0IGl0IG1ha2VzIHRoZSBmbG93IGVhc2llciB0byBmb2xsb3cgdG8gZG8gbm90IG9wdGltaXplIG9uIHRoaXMgZGlmZmVyZW5jZQoqCioJaGNmX3NlbmRfbXNnIGNoZWNrcyB3aGV0aGVyIHRoZSBmcmFtZSBpcyBhbiBFdGhlcm5ldC1JSSByYXRoZXIgdGhhbiBhbiAib2ZmaWNpYWwiIDgwMi4zIGZyYW1lLgoqCVRoZSBFLUlJIGNoZWNrIGlzIGJhc2VkIG9uIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpbiB0aGUgTUFDIGhlYWRlci4gSWYgdGhpcyBmaWVsZCBoYXMgYSB2YWx1ZSBsYXJnZXIgdGhhbgoqCTE1MDAsIEUtSUkgaXMgYXNzdW1lZC4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVzdCBmYWlscyBpZiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaXMgbm90IGluIHRoZSBmaXJzdAoqCWRlc2NyaXB0b3IuICBJZiBFLUlJIGlzIHJlY29nbml6ZWQsIGEgU05BUCBoZWFkZXIgaXMgaW5zZXJ0ZWQuIFRoaXMgU05BUCBoZWFkZXIgcmVwcmVzZW50cyBlaXRoZXIgUkZDMTA0MgoqCW9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBzdXBwb3J0IHJvdXRpbmUgaGNmX2VuY2FwLgoqCiouTk9USUNFCioJaGNmX3NlbmRfbXNnIGxlYXZlcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gb25seSBzZW5kIG1lc3NhZ2VzIG9uIGVuYWJsZWQgcG9ydHMgYXQgdGhlIE1TRiBsZXZlbC4KKglUaGlzIGlzIGNvbnNpZGVyZWQgdGhlIHN0cmF0ZWd5IHdoaWNoIGlzIHN1ZmZpY2llbnRseSBhZGVxdWF0ZSBmb3IgYWxsICJyb2J1c3QiIE1TRnMsIGhhdmUgdGhlIGxlYXN0CioJcHJvY2Vzc29yIHV0aWxpemF0aW9uIGFuZCBiZWluZyBzdGlsbCBhY2NlcHRhYmxlIHJvYnVzdCBhdCB0aGUgV0NJICEhISEhCioKKgloY2Zfc2VuZF9tc2cgZG9lcyBub3QgTkVFRCBhIHJldHVybiB2YWx1ZSB0byByZXBvcnQgTklDIGFic2VuY2Ugb3IgcmVtb3ZhbCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZgoqCWhjZl9zZW5kX21zZygpLCBiZWNhdXNlIHRoZSBNU0YgYW5kIGhpZ2hlciBsYXllcnMgbXVzdCBiZSBhYmxlIHRvIGNvcGUgYW55d2F5IHdpdGggdGhlIE5JQyBiZWluZyByZW1vdmVkCioJYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnKCkgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlLgoqCVRvIGFjY29tbW9kYXRlIHVzZXIgZXhwZWN0YXRpb25zIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgcmVwb3J0IE5JQyBhYnNlbmNlLgoqCURlZnVuY3QgYmxvY2tzIGFsbCBOSUMgYWNjZXNzIGFuZCB3aWxsIChhbHNvKSBiZSByZXBvcnRlZCBvbiBhIG51bWJlciBvZiBvdGhlciBjYWxscy4KKgoqCWhjZl9zZW5kX21zZyBkb2VzIG5vdCBjaGVjayBmb3IgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIEhlcm1lcyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKglJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKglOb3RlIHRoYXQgdGhpcyBwb3NzaWJseSByZXN1bHRzIGluIHRoZSB0cmFuc21pc3Npb24gb2YgaW5jb21wbGV0ZSBmcmFtZXMuCioKKglBZnRlciBzb21lIGRlbGliZXJhdGlvbiB3aXRoIEYvVyB0ZWFtLCBpdCBpcyBkZWNpZGVkIHRoYXQgLSBiZWluZyBpbiB0aGUgdHdpbGlnaHQgem9uZSBvZiBub3Qga25vd2luZwoqCXdoZXRoZXIgdGhlIHByb2JsZW0gYXQgaGFuZCBpcyBhbiBNU0YgYnVnLCBIQ0YgYnVmLCBGL1cgYnVnLCBIL1cgbWFsZnVuY3Rpb24gb3IgZXZlbiBzb21ldGhpbmcgZWxzZSAtIHRoZXJlCioJaXMgbm8gImJlc3QgdGhpbmcgdG8gZG8iIGluIGNhc2Ugb2YgYSBmYWlsaW5nIHNlbmQsIGhlbmNlIHRoZSBIQ0YgY29uc2lkZXJzIHRoZSBUeEZJRCBvd25lcnNoaXAgdG8gYmUgdGFrZW4KKglvdmVyIGJ5IHRoZSBGL1cgYW5kIGhvcGVzIGZvciBhbiBBbGxvY2F0ZSBldmVudCBpbiBkdWUgdGltZQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX3NlbmRfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCnsKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKREVTQ19TVFJDVAkqcCAvKiA9IGRlc2NwKi87CQkvL3dvcmtpbmcgcG9pbnRlcgpoY2ZfMTYJCWxlbjsJCQkJCS8vIHRvdGFsIGJ5dGUgY291bnQKaGNmXzE2CQlpOwoKaGNmXzE2CQlmaWQgPSAwOwoKCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCB8fCBkZXNjcCA9PSBOVUxMLCBpZmJwLT5JRkJfUnNjSW5kICkKCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURCICkKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFTkRfTVNHLCB0eF9jbnRsICkKCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKCUhDRkFTU0VSVF9JTlQKCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCgkgKiBzbyBza2lwICovCglIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQojaWYgSENGX0FTU0VSVAp7CWludCB4ID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQID8gdHhfY250bCAmIH5IRlNfVFhfQ05UTF9QT1JUIDogdHhfY250bDsKCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKQp9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJaWYgKCBkZXNjcCApIGlmYnAtPklGQl9UeEZJRCA9IDA7CQkJCS8vY2FuY2VsIGEgcHJlLXB1dCBtZXNzYWdlCgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9UWF9DT05UCQkJCS8vIENvbnRpbnVvdXMgdHJhbnNtaXQgdGVzdAoJaWYgKCB0eF9jbnRsID09IEhGU19UWF9DTlRMX1RYX0NPTlQgKSB7CgkgCWZpZCA9IGdldF9maWQoaWZicCk7CgkgCWlmIChmaWQgIT0gMCApIHsKCQkJCQkJCQkJCQkvL3NldHVwIEJBUCB0byBiZWdpbiBvZiBUeEZTCgkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAwLCBJT19PVVQgKTsKCQkJCQkJCQkJCQkvL2NvcHkgYWxsIHRoZSBmcmFnbWVudHMgaW4gYSB0cmFuc3BhcmVudCBmYXNoaW9uCgkJIAlmb3IgKCBwID0gZGVzY3A7IHA7IHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApIHsKCQkJLyogb2Jub3hpb3VzIHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlciAqLwoJCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCgkJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CgkJCX0KCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1RIRVNFVVMgfCBIQ01EX0JVU1kgfCBIQ01EX1NUQVJUUFJFQU1CTEUsIGZpZCApOwoJCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKCQkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CgkJCX0KCQl9CgkJCQkJCQkJCQkJLy8gZWVuIHNsZWNodCB2b29yYmVlbGQgZG9ldCBnb2VkIHZvbGdlbiA7PwoJCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCgkJcmV0dXJuIHJjOwoJfQojZW5kaWYgLy8gSENGX0VYVF9UWF9DT05UCgkJCQkJCQkJCS8qIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gY29kZSBpcyByZWR1bmRhbnQgZm9yIGEgcHJlLXB1dCBtZXNzYWdlCgkJCQkJCQkJCSAqIGJ1dCBtb3ZpbmcgaXQgaW5zaWRlIHRoZSAiaWYgZmlkIiBsb2dpYyBtYWtlcyB0aGUgbWVyZ2luZyB3aXRoIHRoZQoJCQkJCQkJCQkgKiBVU0IgZmxvdyBhd2t3YXJkCgkJCQkJCQkJCSAqLwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoJdHhfY250bCB8PSBpZmJwLT5JRkJfTUlDVHhDbnRsOwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCglmaWQgPSBpZmJwLT5JRkJfVHhGSUQ7CglpZiAoZmlkID09IDAgJiYgKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgCQkvKiA0ICovCgkJCS8qIHNraXAgdGhlIG5leHQgY29tcG91bmQgc3RhdGVtZW50IGlmOgoJCQkgICAtIHByZS1wdXQgbWVzc2FnZSBvcgoJCQkgICAtIG5vIGZpZCBhdmFpbGFibGUgKHdoaWNoIHNob3VsZCBuZXZlciBvY2N1ciBpZiB0aGUgTVNGIGFkaGVyZXMgdG8gdGhlIFdDSSkKCQkJICovCgl7CQkvLyB0byBtYXRjaCB0aGUgY2xvc2luZyBjdXJseSBicmFja2V0IG9mIGFib3ZlICJpZiIgaW4gY2FzZSBvZiBIQ0ZfVFlQRV9VU0IKCQkJCQkJCQkJCQkvL2NhbGN1bGF0ZSB0b3RhbCBsZW5ndGggOz8gc3VwZXJmbHVvdXMgdW5sZXNzIENDWCBvciBFbmNhcHN1bGF0aW9uCgkJbGVuID0gMDsKCQlwID0gZGVzY3A7CgkJZG8gbGVuICs9IHAtPkJVRl9DTlQ7IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CgkJcCA9IGRlc2NwOwovLzs/CUhDRkFTU0VSVCggbGVuIDw9IEhDRl9NQVhfTVNHLCBsZW4gKQovKjcqLwkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgSEZTX1RYX0NOVEwsIElPX09VVCApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1RYX0RFTEFZCgkJSENGQVNTRVJUKCAoIGRlc2NwICE9IE5VTEwgKSBeICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICksIHR4X2NudGwgKQoJCWlmICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICkgewoJCQl0eF9jbnRsICY9IH5IRlNfVFhfQ05UTF9UWF9ERUxBWTsJCS8vISFIRlNfVFhfQ05UTF9UWF9ERUxBWSBubyBsb25nZXIgYXZhaWxhYmxlCgkJCWlmYnAtPklGQl9UeEZJRCA9IGZpZDsKCQkJZmlkID0gMDsJCQkJCQkJCS8vISFmaWQgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgYmUgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyBjb2RlCgkJfQojZW5kaWYgLy8gSENGX1RZUEVfVFhfREVMQVkKCQlPUFcoIEhSRUdfREFUQV8xLCB0eF9jbnRsICkgOwoJCU9QVyggSFJFR19EQVRBXzEsIDAgKTsKI2lmICEgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYICkKCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPj0gMTQsIHAtPkJVRl9DTlQgKQoJCQkJCQkJCQkJCS8qIGFzc3VtZSBEZXN0QWRkci9TcmNBZGRyL0xlbi9UeXBlIEFMV0FZUyBjb250YWluZWQgaW4gMXN0IGZyYWdtZW50CgkJCQkJCQkJCQkJICogb3RoZXJ3aXNlIGxpZmUgZ2V0cyB0b28gY3VtYmVyc29tZSBmb3IgTUlDIGFuZCBFbmNhcHN1bGF0aW9uICEhISEhISEhCgkJaWYgKCBwLT5CVUZfQ05UID49IDE0ICkgewlhbHRlcm5hdGl2ZWx5OiBhZGQgYSBzYWZldHkgZXNjYXBlICEhISEhISEhISEhISB9CSovCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQlDQUxDX1RYX01JQyggTlVMTCwgLTEgKTsJCS8vaW5pdGlhbGl6ZSBNSUMKLyoxMCovCXB1dF9mcmFnKCBpZmJwLCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSBCRV9QQVIoMCkgKTsJLy93cml0ZSBEQSwgU0Egd2l0aCBNSUMgY2FsY3VsYXRpb24KCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsJCS8vTUlDIG92ZXIgREEsIFNBCgkJQ0FMQ19UWF9NSUMoIG51bGxfYWRkciwgNCApOwkJLy9NSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCQkvLyEhYmUgY2FyZWZ1bCBkbyBub3QgdXNlIHBvc2l0aXZlIHRlc3Qgb24gSENGX0FDVF9DQ1hfT0ZGLCBiZWNhdXNlIElGQl9DS0lQU3RhdCBpcyBpbml0aWFsbHkgMAoJCWlmKCggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKICAgICAgICAgICAoKEdFVF9CVUZfQ05UKHApID49IDIwICkgICAmJiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKSAmJgogICAgICAgICAgICAocC0+YnVmX2FkZHJbMTJdID09IDB4QUEpICYmIChwLT5idWZfYWRkclsxM10gPT0gMHhBQSkgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzKSAmJiAocC0+YnVmX2FkZHJbMTVdID09IDB4MDApICYmCiAgICAgICAgICAgIChwLT5idWZfYWRkclsxNl0gPT0gMHg0MCkgJiYgKHAtPmJ1Zl9hZGRyWzE3XSA9PSAweDk2KSAmJgogICAgICAgICAgICAocC0+YnVmX2FkZHJbMThdID09IDB4MDApICYmIChwLT5idWZfYWRkclsxOV0gPT0gMHgwMCkpKQogICAgICAgIHsKICAgICAgICAgICAgaSA9IEhDRl9EQVNBX1NJWkU7CgogICAgICAgICAgICBPUFcoIEhSRUdfREFUQV8xLCBDTlZfU0hPUlRfVE9fQklHKCBsZW4gLSBpICkpOwoKICAgICAgICAgICAgLyogbmVlZCB0byBzZW5kIG91dCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmcmFnbWVudCAqLwoJCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBHRVRfQlVGX0NOVChwKSAtIGkgQkVfUEFSKDApICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCXsKCQkJCQkJCQkJCQkvL2lmIGVuY2Fwc3VsYXRpb24gbmVlZGVkCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJCQkJCQkJCQkJLy93cml0ZSBsZW5ndGggKHdpdGggU05BUC1oZWFkZXIsVHlwZSwgd2l0aG91dCAvL0RBLFNBLExlbmd0aCApIG5vIE1JQyBjYWxjLgoJCQlpZiAoICggc25hcF9oZWFkZXJbc2l6ZW9mKHNuYXBfaGVhZGVyKS0xXSA9IGhjZl9lbmNhcCggJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgKSAhPSBFTkNfTk9ORSApIHsKCQkJCU9QVyggSFJFR19EQVRBXzEsIENOVl9FTkRfU0hPUlQoIGxlbiArIChzaXplb2Yoc25hcF9oZWFkZXIpICsgMikgLSAoIDIqNiArIDIgKSApICk7CgkJCQkJCQkJCQkJLy93cml0ZSBzcGxpY2Ugd2l0aCBNSUMgY2FsY3VsYXRpb24KCQkJCXB1dF9mcmFnKCBpZmJwLCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSBCRV9QQVIoMCkgKTsKCQkJCUNBTENfVFhfTUlDKCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSApOwkvL01JQyBvdmVyIDYgYnl0ZSBTTkFQCgkJCQlpID0gSENGX0RBU0FfU0laRTsKCQkJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfRU5DCgkJCXsKCQkJCU9QVyggSFJFR19EQVRBXzEsICood2NpX3JlY29yZHApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICk7CgkJCQlpID0gMTQ7CgkJCX0KCQkJCQkJCQkJCQkvL2NvbXBsZXRlIDFzdCBmcmFnbWVudCBzdGFydGluZyB3aXRoIFR5cGUgd2l0aCBNSUMgY2FsY3VsYXRpb24KCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgQkVfUEFSKDApICk7CgkJCUNBTENfVFhfTUlDKCAmcC0+YnVmX2FkZHJbaV0sIHAtPkJVRl9DTlQgLSBpICk7CgkJfQoJCQkJCQkJCQkJCS8vZG8gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMgd2l0aCBNSUMgY2FsY3VsYXRpb24KCQl3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApIHsKCQkJLyogb2Jub3hpb3VzIGM6L2hjZi9oY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlciwKCQkJICogc28gc2tpcCAqLwoJCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOwoJCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgKTsKCQl9CgkJCQkJCQkJCQkJLy9wYWQgbWVzc2FnZSwgZmluYWxpemUgTUlDIGNhbGN1bGF0aW9uIGFuZCB3cml0ZSBNSUMgdG8gTklDCgkJcHV0X2ZyYWdfZmluYWxpemUoIGlmYnAgKTsKCX0KCWlmICggZmlkICkgewovKjE2Ki8JcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0JVU1kgfCBIQ01EX1RYIHwgSENNRF9SRUNMLCBmaWQgKTsKCQlpZmJwLT5JRkJfVHhGSUQgPSAwOwoJCQkvKiBwcm9iYWJseSB0aGlzIChpLmUuIG5vIFJzY0luZCBBTkQgIkhSRUdfRVZfQUxMT0MiKSBhdCB0aGlzIHBvaW50IGluIHRpbWUgb2NjdXJzIHNvIGluZnJlcXVlbnQsCgkJCSAqIHRoYXQgaXQgbWlnaHQganVzdCBhcyB3ZWxsIGJlIGFjY2VwdGFibGUgdG8gc2tpcCB0aGlzCgkJCSAqICJvcHRpbWl6YXRpb24iIGNvZGUgYW5kIGhhbmRsZSB0aGF0IGFkZGl0aW9uYWwgaW50ZXJydXB0IG9uY2UgaW4gYSB3aGlsZQoJCQkgKi8KLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKLyoyMCovCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgewoJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOwoJCX0KLy8gI2VuZGlmIC8vIEFMTE9DXzE1Cgl9Ci8vCUhDRkFTU0VSVCggbGV2ZWw6OmlmYnAtPklGQl9Sc2NJbmQsIGlmYnAtPklGQl9Sc2NJbmQgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFTkRfTVNHICkKCXJldHVybiByYzsKfSAvLyBoY2Zfc2VuZF9tc2cKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2Zfc2VydmljZV9uaWMoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApCiouUFVSUE9TRQkJU2VydmljZXMgKG1vc3QpIE5JQyBldmVudHMuCioJCQkJUHJvdmlkZXMgcmVjZWl2ZWQgbWVzc2FnZQoqCQkJCVByb3ZpZGVzIHN0YXR1cyBpbmZvcm1hdGlvbi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqICBJbiBub24tRE1BIG1vZGU6CioJYnVmcAkJYWRkcmVzcyBvZiBjaGFyIGJ1ZmZlciwgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFJ4RlMgdXAgdGhyb3VnaCBIRlNfVFlQRQoqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKgkJCQl2YWx1ZSBiZXR3ZWVuIEhGU19UWVBFICsgMiBhbmQgSEZTX0FERFJfREVTVCArIEhDRl9NQVhfTVNHCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKglIQ0ZfRVJSX01JQwltZXNzYWdlIGNvbnRhaW5zIGFuIGVycm9uZW91cyBNSUMgKG9ubHkgaWYgZnJhbWUgZml0cyBjb21wbGV0ZWx5IGluIGJ1ZnApCioKKi5ERVNDUklQVElPTgoqCiogTVNGLWFjY2Vzc2libGUgZmllbGRzIG9mIFJlc3VsdCBCbG9jawoqIC0gSUZCX1J4TGVuCQkJMCBvciBGcmFtZSBzaXplLgoqIC0gSUZCX01CSW5mb0xlbgkJMCBvciB0aGUgTC1maWVsZCBvZiB0aGUgb2xkZXN0IE1CSUIuCiogLSBJRkJfUnNjSW5kCiogLSBJRkJfSENGX1RhbGxpZXMJCXVwZGF0ZWQgaWYgYSBjb3JyZXNwb25kaW5nIGV2ZW50IG9jY3VycmVkLgoqIC0gSUZCX05JQ19UYWxsaWVzCQl1cGRhdGVkIGlmIGEgVGFsbHkgSW5mbyBmcmFtZSByZWNlaXZlZCBmcm9tIHRoZSBOSUMuCiogLSBJRkJfRG1hUGFja2V0cwoqIC0gSUZCX1R4RnNTdGF0CiogLSBJRkJfVHhGc1N3U3VwCiogLSBJRkJfTGlua1N0YXQJCXJlZmxlY3RzIG5ldyBsaW5rIHN0YXR1cyBvciAweDAwMDAgaWYgbm8gY2hhbmdlIHJlbGF0aXZlIHRvIHByZXZpb3VzIGhjZl9zZXJ2aWNlX25pYyBjYWxsLgpvcgoqIC0gSUZCX0xpbmtTdGF0CQlsaW5rIHN0YXR1cywgMHg4MDAwIHJlZmxlY3RzIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KKgoqIFdoZW4gSUZCX01CSW5mb0xlbiBpcyBub24temVybywgYXQgbGVhc3Qgb25lIE1CSUIgaXMgYXZhaWxhYmxlLgoqCiogSUZCX1J4TGVuCXJlZmxlY3RzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgaW4gODAyLjMgdmlldyAoSW5jbHVkaW5nIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW5ndGgsCiogZXhjbHVkaW5nIE1JQy1wYWRkaW5nLCBNSUMgYW5kIHN1bSBjaGVjaykgb2YgYWN0aXZlIFJ4IEZyYW1lIFN0cnVjdHVyZS4gSWYgbm8gUnggRGF0YSBzIGF2YWlsYWJsZSwgSUZCX1J4TGVuCiogZXF1YWxzIDB4MDAwMC4KKiBSZXBlYXRlZCBleGVjdXRpb24gY2F1c2VzIHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHN1YnNlcXVlbnRseSByZWNlaXZlZAoqIG1lc3NhZ2VzLCBpcnJlc3BlY3RpdmUgd2hldGhlciBhIGhjZl9yY3ZfbXNnIG9yIGhjZl9hY3Rpb24oSENGX0FDVF9SWCkgaXMgcGVyZm9ybWVkIGluIGJldHdlZW4uCioKKiBXaGVuIElGQl9SeExlbiBpcyBub24temVybywgYSBSZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlIHRvIGJlIHJvdXRlZCB0byB0aGUgcHJvdG9jb2wgc3RhY2suCiogV2hlbiBNb25pdG9yIE1vZGUgaXMgbm90IGFjdGl2ZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIGVycm9yLWZyZWUgbm9uLVdNUCBmcmFtZS4KKiBJbiBjYXNlIG9mIE1vbml0b3IgTW9kZSwgaXQgbWF5IGFsc28gYmUgYSBmcmFtZSB3aXRoIGFuIGVycm9yIG9yIGEgV01QIGZyYW1lLgoqIEVycm9uZW91cyBmcmFtZXMgaGF2ZSBhIG5vbi16ZXJvIGVycm9yLXN1YiBmaWVsZCBpbiB0aGUgSEZTX1NUQVQgZmllbGQgaW4gdGhlIGxvb2sgYWhlYWQgYnVmZmVyLgoqCiogSWYgYSBSZWNlaXZlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGluIE5JQyBSQU0sIHRoZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSBpcyAocGFydGx5KSBjb3BpZWQgZnJvbSB0aGUgTklDIHRvCiogdGhlIGJ1ZmZlciBpZGVudGlmaWVkIGJ5IGJ1ZnAuCiogQ29weWluZyBzdG9wcyBlaXRoZXIgYWZ0ZXIgbGVuIGJ5dGVzIG9yIHdoZW4gdGhlIGNvbXBsZXRlIDgwMi4zIGZyYW1lIGlzIGNvcGllZC4KKiBEdXJpbmcgdGhlIGNvcHlpbmcgdGhlIG1lc3NhZ2UgaXMgZGVjYXBzdWxhdGVkIChpZiBhcHByb3ByaWF0ZSkuCiogSWYgdGhlIGZyYW1lIGlzIHJlYWQgY29tcGxldGVseSBieSBoY2Zfc2VydmljZV9uaWMgKGkuZS4gdGhlIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciksCiogdGhlIGZyYW1lIGlzIGF1dG9tYXRpY2FsbHkgQUNLJ2VkIHRvIHRoZSBGL1cgYW5kIHN0aWxsIGF2YWlsYWJsZSB2aWEgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGFuZCBoY2ZfcmN2X21zZy4KKiBPbmx5IGlmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljLCBoY2Zfc2VydmljZV9uaWMgY2hlY2tzIHRoZSBNSUMgYW5kIHNldHMgdGhlIHJldHVybgoqIHN0YXR1cyBhY2NvcmRpbmdseS4gIEluIHRoaXMgY2FzZSwgaGNmX3Jjdl9tc2cgZG9lcyBub3QgY2hlY2sgdGhlIE1JQy4KKgoqIFRoZSBNSUMgY2FsY3VsYXRpb24gYWxnb3JpdGhtIHdvcmtzIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGlzCiogc3VjaCB0aGF0IGl0IGZpdHMgZXhhY3RseSA0IG4gYnl0ZXMgb2YgdGhlIDgwMi4zIGZyYW1lLCBpLmUuIGxlbiA9PSBIRlNfQUREUl9ERVNUICsgNCpuLgoqCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBOSUMgZXZlbnQgc2VydmljZSBoYW5kbGluZyBwcm9jZXNzLgoqIEl0IHBlcmZvcm1zIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zIHRvIHNlcnZpY2UgdGhlIE5JQywgc3VjaCB0aGF0IHRoZSBldmVudCBjYXVzZSBpcyBlbGltaW5hdGVkIGFuZCByZWxhdGVkCiogaW5mb3JtYXRpb24gaXMgc2F2ZWQuCiogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgSVNSIG9yIHBvbGxpbmcgcm91dGluZSBhcyBmaXJzdCBzdGVwIHRvIGRldGVybWluZSB0aGUgZXZlbnQKKiBjYXVzZShzKS4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIHBlcmZvcm0gYWxsIG5vdCBkaXJlY3RseSBOSUMgcmVsYXRlZCBpbnRlcnJ1cHQgc2VydmljZQoqIGFjdGlvbnMsIGUuZy4gaW4gYSBQQyBlbnZpcm9ubWVudCB0aGlzIGluY2x1ZGVzIHNlcnZpY2luZyB0aGUgUElDLCBhbmQgbWFuYWdpbmcgdGhlIFByb2Nlc3NvciBJbnRlcnJ1cHQKKiBFbmFibGluZy9EaXNhYmxpbmcuCiogSW4gY2FzZSBvZiBhIHBvbGxlZCBiYXNlZCBzeXN0ZW0sIHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBtdXN0IGJlIGV4ZWN1dGVkICJmcmVxdWVudGx5Ii4KKiBUaGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbWF5IGhhdmUgc2lkZSBlZmZlY3RzIHJlbGF0ZWQgdG8gdGhlIE1haWxib3ggYW5kIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkuCioKKiBoY2Zfc2VydmljZV9uaWMgcmV0dXJuczoKKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGF2YWlsYWJsZSBNQklCIChJRkJfTUJJbmZvTGVuKQoqIC0gQ2hhbmdlcyBpbiB0aGUgbGluayBzdGF0dXMgKElGQl9MaW5rU3RhdCkKKiAtIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gdGhlIGF2YWlsYWJsZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAoSUZCX1J4TGVuKQoqIC0gdXBkYXRlZCBJRkJfUnNjSW5kCiogLSBVcGRhdGVkIFRhbGxpZXMKKgoqIGhjZl9zZXJ2aWNlX25pYyBpcyBwcmVzdW1lZCB0byBuZWl0aGVyIGludGVycnVwdCBvdGhlciBIQ0YtdGFza3Mgbm9yIHRvIGJlIGludGVycnVwdGVkIGJ5IG90aGVyIEhDRi10YXNrcy4KKiBBIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcHJlY2VkZSBoY2Zfc2VydmljZV9uaWMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgSENGLXRhc2tzIHdpdGggYSBjYWxsIHRvCiogaGNmX2FjdGlvbiB0byBkaXNhYmxlIHRoZSBjYXJkIGludGVycnVwdHMgYW5kLCBhZnRlciBhbGwgd29yayBpcyBjb21wbGV0ZWQsIHdpdGggYSBjYWxsIHRvIGhjZl9hY3Rpb24gdG8KKiByZXN0b3JlICh3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgZW5hYmxpbmcpIHRoZSBjYXJkIGludGVycnVwdHMuCiogSW4gY2FzZSBvZiBhIHBvbGxlZCBlbnZpcm9ubWVudCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBNU0YgcHJvZ3JhbW1lciBpcyBzdWZmaWNpZW50bHkgZmFtaWxpYXIgd2l0aCB0aGUKKiBzcGVjaWZpYyByZXF1aXJlbWVudHMgb2YgdGhhdCBlbnZpcm9ubWVudCB0byB0cmFuc2xhdGUgdGhlIGludGVycnVwdCBzdHJhdGVneSB0byBhIHBvbGxlZCBzdHJhdGVneS4KKgoqIGhjZl9zZXJ2aWNlX25pYyBzZXJ2aWNlcyB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6CiogLSBIUkVHX0VWX0lORk8JCUFzeW5jaHJvbm91cyBJbmZvcm1hdGlvbiBGcmFtZQoqIC0gSFJFR19FVl9JTkZPX0RST1AJV01BQyBkaWQgbm90IGhhdmUgc3VmZmljaWVudCBSQU0gdG8gYnVpbGQgVW5zb2xpY2l0ZWQgSW5mb3JtYXRpb24gRnJhbWUKKiAtIEhSRUdfRVZfVFhfRVhDCQkoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0VYVF9JTlRfVFhfRVggYml0IG9mIEhDRl9FWFQpCiogLSBIUkVHX0VWX1NMRUVQX1JFUQkoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0REUy9IQ0ZfQ0RTIGJpdCBvZiBIQ0ZfU0xFRVApCiogKiogaW4gbm9uX0RNQSBtb2RlCiogLSBIUkVHX0VWX0FMTE9DCQlBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkIHdoaWxlIG91dCBvZiByZXNvdXJjZXMgYXQKKiAJCQkJCQljb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZy9ub3RpZnkKKiAtIEhSRUdfRVZfUlgJCQl0aGUgZGV0ZWN0aW9uIG9mIHRoZSBhdmFpbGFiaWxpdHkgb2YgcmVjZWl2ZWQgbWVzc2FnZXMKKiAJCQkJCQlpbmNsdWRpbmcgV2F2ZUxBTiBNYW5hZ2VtZW50IFByb3RvY29sIChXTVApIG1lc3NhZ2UgcHJvY2Vzc2luZwoqICoqIGluIERNQSBtb2RlCiogLSBIUkVHX0VWX1JETUFECiogLSBIUkVHX0VWX1RETUFECiohISBoY2Zfc2VydmljZV9uaWMgZG9lcyBub3Qgc2VydmljZSB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6CiohISAJSFJFR19FVl9UWCAJCQkodGhlICJPSyIgVHggRXZlbnQpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIFdDSSwgaWYgaXQgb2NjdXJzIGl0IGlzIHVuY2xlYXIKKiEhIAkJCQkJCXdoYXQgdGhlIGNhdXNlIGlzLCBzbyBubyBtZWFuaW5nZnVsIHN0cmF0ZWd5IGlzIGF2YWlsYWJsZS4gTm90IGFja2luZyB0aGUgYml0IGlzCiohISAJCQkJCQlwcm9iYWJseSB0aGUgYmVzdCBoZWxwIHRoYXQgY2FuIGJlIGdpdmVuIHRvIHRoZSBkZWJ1Z2dlci4KKiEhIAlIUkVHX0VWX0NNRAkJCWhhbmRsZWQgaW4gY21kX3dhaXQuCiohISAJSFJFR19FVl9GV19ETUEgCQkoaS5lLiBIUkVHX0VWX1JYRE1BLCBIUkVHX0VWX1RYRE1BIGFuZF9FVl9MUEVTQykgYXJlIGVpdGhlciBub3QgdXNlZCBvciB1c2VkCiohISAJCQkJCQliZXR3ZWVuIHRoZSBGL1cgYW5kIHRoZSBETUEgZW5naW5lLgoqISEgCUhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIEgtSUkgKGkuZS4gbm90IEhJSS41IGFuZCB1cCwgc2VlIERBV0EpCioKKglJZiwgaW4gbm9uLURNQSBtb2RlLCBhIFJ4IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBpdHMgbGVuZ3RoIGlzIHJlZmxlY3RlZCBieSB0aGUgSUZCX1J4TGVuIGZpZWxkIG9mIHRoZSBJRkIuCioJVGhpcyBsZW5ndGggcmVmbGVjdHMgdGhlIGRhdGEgaXRzZWxmIGFuZCB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIERhdGFMZW5ndGgvVHlwZSBmaWVsZAoqCWJ1dCBub3QgdGhlIFNOQVAtaGVhZGVyIGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGLiAgSWYgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUsIElGQl9SeExlbiBpcwoqCXplcm8uICBGb3JtZXIgdmVyc2lvbnMgb2YgdGhlIEhDRiBoYW5kbGVkIFdNUCBtZXNzYWdlcyBhbmQgc3VwcG9ydGVkIGEgIm1vbml0b3IiIG1vZGUgaW4gaGNmX3NlcnZpY2VfbmljLAoqCXdoaWNoIGRlcG9zaXRlZCBjZXJ0YWluIG9yIGFsbCBSeCBtZXNzYWdlcyBpbiB0aGUgTWFpbEJveC4gVGhlIHJlc3BvbnNpYmlsaXR5IHRvIGhhbmRsZSB0aGVzZSBmcmFtZXMgaXMKKgltb3ZlZCB0byB0aGUgTVNGLiBUaGUgSENGIG9mZmVycyBhcyBzdXBwb3J0cyBoY2ZfcHV0X2luZm8gd2l0aCBDRkdfTUJfSU5GTyBhcyBwYXJhbWV0ZXIgdG8gZW11bGF0ZSB0aGUgb2xkCiogCWltcGxlbWVudGF0aW9uIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE1TRi4KKgoqICoqUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kKKglXaGVuIGhjZl9zZXJ2aWNlX25pYyByZXBvcnRzIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBub24tRE1BIG1lc3NhZ2UsIHRoZSBNU0YgY2FuIGFjY2VzcyB0aGF0IG1lc3NhZ2UgYnkKKgltZWFucyBvZiBoY2ZfcmN2X21zZy4gSXQgbXVzdCBiZSBwcmV2ZW50ZWQgdGhhdCB0aGUgTEFOIENvbnRyb2xsZXIgd3JpdGVzIG5ldyBkYXRhIGluIHRoZSBOSUMgYnVmZmVyCioJYmVmb3JlIHRoZSBNU0YgaXMgZmluaXNoZWQgd2l0aCB0aGUgY3VycmVudCBtZXNzYWdlLiBUaGUgTklDIGJ1ZmZlciBpcyByZXR1cm5lZCB0byB0aGUgTEFOIENvbnRyb2xsZXIKKgl3aGVuOgoqCSAtIHRoZSBjb21wbGV0ZSBmcmFtZSBmaXRzIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yCioJIC0gaGNmX3Jjdl9tc2cgaXMgY2FsbGVkIG9yCioJIC0gaGNmX2FjdGlvbiB3aXRoIEhDRl9BQ1RfUlggaXMgY2FsbGVkIG9yCioJIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCBhZ2FpbgoqCUl0IGNhbiBiZSByZWFzb25lZCB0aGF0IGhjZl9hY3Rpb24oIElOVF9PTiApIHNob3VsZCBub3QgYmUgZ2l2ZW4gYmVmb3JlIHRoZSBNU0YgaGFzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkCioJYSByZXBvcnRlZCBSeC1mcmFtZS4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBJTlRfT04gYWN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgYSAoUngtKWludGVycnVwdCAodGhlCioJTVNGIGlzIHByb2Nlc3NpbmcgYSBSeC1mcmFtZSwgaGVuY2UgdGhlIFJ4LWV2ZW50IGJpdCBpbiB0aGUgSGVybWVzIHJlZ2lzdGVyIG11c3QgYmUgYWN0aXZlKS4gVGhpcwoqCWludGVycnVwdCB3aWxsIGNhdXNlIGhjZl9zZXJ2aWNlX25pYyB0byBiZSBjYWxsZWQsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGFjay1pbmcgb2YgdGhlICJsYXN0IiBSeC1ldmVudAoqCXRvIHRoZSBIZXJtZXMsIGNhdXNpbmcgdGhlIEhlcm1lcyB0byBkaXNjYXJkIHRoZSBhc3NvY2lhdGVkIE5JQyBSQU0gYnVmZmVyLgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBpcyB6ZXJvIG9yIG90aGVyIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBoY2Zfc2VydmljZV9uaWMgaXMgY2FsbGVkIHdpdGhvdXQgYSBwcmlvciBjYWxsIHRvIGhjZl9jb25uZWN0LgoqIC0gaW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKgoqCiouRElBR1JBTQoqMToJSUZCX0xpbmtTdGF0IGlzIGNsZWFyZWQsIGlmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseQoqCWJ5IGlzcl9pbmZvLgpvcgoqMToJSUZCX0xpbmtTdGF0IGNoYW5nZSBpbmRpY2F0aW9uIGlzIGNsZWFyZWQuIElmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZAoqCWFjY29yZGluZ2x5IGJ5IGlzcl9pbmZvLgoqMjogSUZCX1J4TGVuIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgdGhlIE5JQyBwcmVzZW5jZSBjaGVjayBvdGhlcndpc2U6CioJIC0JdGhpcyB2YWx1ZSBtYXkgc3RheSBub24temVybyBpZiB0aGUgTklDIGlzIHB1bGxlZCBvdXQgYXQgYW4gaW5jb252ZW5pZW50IG1vbWVudC4KKgkgLQl0aGUgUnhBY2sgb24gYSB6ZXJvLUZJRCBuZWVkcyBhIHplcm8tdmFsdWUgZm9yIElGQl9SeExlbiB0byB3b3JrCioJIE5vdGUgdGhhdCBhcyBzaWRlLWVmZmVjdCBvZiB0aGUgaGNmX2FjdGlvbiBjYWxsLCB0aGUgcmVtYWluZGVyIG9mIFJ4IHJlbGF0ZWQgaW5mbyBpcyByZS1pbml0aWFsaXplZCBhcwoqCSB3ZWxsLgoqNDoJSW4gY2FzZSBvZiBEZWZ1bmN0IG1vZGUsIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSBIZXJtZXMgaXMgdW5yZWxpYWJsZSwgc28gdGhlIGJvZHkgb2YKKgloY2Zfc2VydmljZV9uaWMgaXMgc2tpcHBlZC4gU2luY2UgaGNmX2NudGwgdHVybnMgaW50byBhIE5PUCBpZiBQcmltYXJ5IG9yIFN0YXRpb24gRi9XIGlzIGluY29tcGF0aWJsZSwKKgloY2Zfc2VydmljZV9uaWMgaXMgYWxzbyBza2lwcGVkIGluIHRob3NlIGNhc2VzLgoqCVRvIHByZXZlbnQgdGhhdCBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyBib2d1cyBpbmZvcm1hdGlvbiB0byB0aGUgTVNGIHdpdGggYWxsIC0gcG9zc2libHkgZGlmZmljdWx0IHRvCioJZGVidWcgLSB1bmRlc2lyYWJsZSBzaWRlIGVmZmVjdHMsIGl0IGlzIHBhcmFtb3VudCB0byBjaGVjayB0aGUgTklDIHByZXNlbmNlLiBJbiBmb3JtZXIgZGF5cyB0aGUgcHJlc2VuY2UKKgl0ZXN0IHdhcyBiYXNlZCBvbiB0aGUgSGVybWVzIHJlZ2lzdGVyIEhSRUdfU1dfMC4gU2luY2UgaW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNob29zZW4gZm9yIHN0cmF0ZWd5IGJhc2VkIG9uCioJSFJFR19FVl9TVEFULCB0aGlzIGlzIG5vdyBhbHNvIHVzZWQgaW4gaGNmX3NlcnZpY2VfbmljLiBUaGUgbW90aXZhdGlvbiB0byBjaGFuZ2Ugc3RyYXRlZ3kgaXMgcGFydGx5CioJZHVlIHRvIGluY29uc2lzdGVudCBGL1cgaW1wbGVtZW50YXRpb25zIHdpdGggcmVzcGVjdCB0byBIUkVHX1NXXzAgbWFuaXB1bGF0aW9uIGFyb3VuZCByZXNldCBhbmQgZG93bmxvYWQuCioJTm90ZSB0aGF0IGluIHBvbGxlZCBlbnZpcm9ubWVudHMgQ2FyZCBSZW1vdmFsIGlzIG5vdCBkZXRlY3RlZCBieSBJTlRfT0ZGIHdoaWNoIG1ha2VzIHRoZSBjaGVjayBpbgoqCWhjZl9zZXJ2aWNlX25pYyBldmVuIG1vcmUgaW1wb3J0YW50LgoqODoJVGhlIGV2ZW50IHN0YXR1cyByZWdpc3RlciBvZiB0aGUgSGVybWVzIGlzIHNhbXBsZWQKKglUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/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+SUZCX0NhcnJ5SW4gfD0gMHgxOwoJCX0KCX0KI2lmIEhDRl9CSUdfRU5ESUFOCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQoJSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFMiggd29yZF9sZW4sIGxlbiApICkKCS8vc2VlIHB1dF9mcmFnIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGJlIGNhcmVmdWxsIGFib3V0IHdoYXQgYXJlIGludCdzIGFuZCB3aGF0IGFyZQoJLy9oY2ZfMTYncwoJaWYgKCB3b3JkX2xlbiApIHsJCQkJCQkJCS8vLiAgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydApoY2ZfOCBjOwoJCWMgPSBidWZwWzFdOwkJCQkJCQkJLy8uICAuICBjb252ZXJ0IHRoZSAxc3QgaGNmXzE2CgkJYnVmcFsxXSA9IGJ1ZnBbMF07CgkJYnVmcFswXSA9IGM7CgkJaWYgKCB3b3JkX2xlbiA+IDEgKSB7CQkJCQkJLy8uICAuICBpZiB0aGVyZSBpcyB0byBjb252ZXJ0IG1vcmUgdGhhbiAxIHdvcmQgKCBpLmUgMiApCgkJCWMgPSBidWZwWzNdOwkJCQkJCQkvLy4gIC4gIC4gIGNvbnZlcnQgdGhlIDJuZCBoY2ZfMTYKCQkJYnVmcFszXSA9IGJ1ZnBbMl07CgkJCWJ1ZnBbMl0gPSBjOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCn0gLy8gZ2V0X2ZyYWcKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IGluaXQoIElGQlAgaWZicCApCiouUFVSUE9TRQkJSGFuZGxlcyBjb21tb24gaW5pdGlhbGl6YXRpb24gYXNwZWN0cyAoSC1JIGluaXQsIGNhbGlicmF0aW9uLCBjb25maWcubW5nbXQsIGFsbG9jYXRpb24pLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJSENGX0VSUl9JTkNPTVBfUFJJCioJSENGX0VSUl9JTkNPTVBfRlcKKglIQ0ZfRVJSX1RJTUVfT1VUCioJPj5oY2ZfZ2V0X2luZm8KKgkJSENGX0VSUl9OT19OSUMKKgkJSENGX0VSUl9MRU4KKgoqLkRFU0NSSVBUSU9OCiogaW5pdCB3aWxsIHN1Y2Nlc3NpdmVseToKKiAtIGluIGNhc2Ugb2YgYSAobm9uLXByZWxvYWRlZCkgSC1JLCBpbml0aWFsaXplIHRoZSBOSUMKKiAtIGNhbGlicmF0ZSB0aGUgUy9XIHByb3RlY3Rpb24gdGltZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyCiogLSBjb2xsZWN0IEhTSSwgImFjdGl2ZSIgRi9XIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBJbmZvcm1hdGlvbgoqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIFByaW1hcnkgRi9XOiBjb2xsZWN0IFByaW1hcnkgRi9XIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBJbmZvcm1hdGlvbgoqIC0gY2hlY2sgSFNJIGFuZCBQcmltYXJ5IEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgoqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIFN0YXRpb24gb3IgQVAgRi9XOiBjaGVjayBTdGF0aW9uIG9yIEFQIEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgoqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIG5vdCBQcmltYXJ5IEYvVzogYWxsb2NhdGUgRklEcyB0byBiZSB1c2VkIGluIHRyYW5zbWl0L25vdGlmeSBwcm9jZXNzCioKKgoqLkRJQUdSQU0KKjI6CWRyb3AgYWxsIGVycm9yIHN0YXR1cyBiaXRzIGluIElGQl9DYXJkU3RhdCBzaW5jZSB0aGV5IGFyZSBleHBlY3RlZCB0byBiZSByZS1ldmFsdWF0ZWQuCio0OglBY2sgZXZlcnl0aGluZyBleGNlcHQgSFJFR19FVl9TTEVFUF9SRVEuIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQKKgl2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIFNlbmQgQ21kIGV2ZW50IGlzIHBlbmRpbmcuIEFja2luZyBIUkVHX0VWX1NMRUVQX1JFUSBpcyBoYW5kbGVkIGJ5IGhjZl9hY3Rpb24oCioJSENGX0FDVF9JTlRfT04gKSAhISEKKjEwOiBDYWxpYnJhdGUgdGhlIFMvVyB0aW1lLW91dCBwcm90ZWN0aW9uIG1lY2hhbmlzbSBieSBjYWxsaW5nIGNhbGlicmF0ZSgpLiBOb3RlIHRoYXQgcG9zc2libGUgZXJyb3JzCioJaW4gdGhlIGNhbGlicmF0aW9uIHByb2Nlc3MgYXJlIG5vciByZXBvcnRlZCBieSBpbml0IGJ1dCB3aWxsIHNob3cgdXAgdmlhIHRoZSBkZWZ1bmN0IG1lY2hhbmlzbSBpbgoqCXN1YnNlcXVlbnQgaGNmLWNhbGxzLgoqMTQ6IHVzYl9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGhhdmUgdGhlIG1pbmltYWwgdmlzdWFsIGNsdXR0ZXIgZm9yIHRoZSBsZWdhY3kgSC1JIFVTQiBkb25nbGUKKgljb21wYXRpYmlsaXR5IGNoZWNrLgoqMTY6IFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkIGZyb20gdGhlIE5JQzoKKgkgLSBIU0kgc3VwcGxpZXIKKgkgLSBGL1cgSWRlbnRpdHkKKgkgLSBGL1cgc3VwcGxpZXIKKgkgaWYgYXBwcm9wcmlhdGU6CioJIC0gUFJJIElkZW50aXR5CioJIC0gUFJJIHN1cHBsaWVyCioJIGFwcHJvcHJpYXRlIG1lYW5zIG9uIEgtSTogYWx3YXlzCioJIGFuZCBvbiBILUlJIGlmIEYvVyBzdXBwbGllciByZWZsZWN0cyBhIHByaW1hcnkgKGkuZS4gb25seSBhZnRlciBhbiBIZXJtZXMgUmVzZXQgb3IgSW5pdAoqCSBjb21tYW5kKS4KKgkgUVVFU1RJT04gOz8gISEhISEhIHNob3VsZCwgRm9yIGVhY2ggb2YgdGhlIGFib3ZlIFJJRHMgdGhlIEVuZGlhbmVzcyBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKgkgT25seSB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIGZpcnN0IGhjZl9nZXRfaW5mbyBpcyB1c2VkLiBBbGwgaGNmX2dldF9pbmZvIGNhbGxzIGFyZSBtYWRlLCByZWdhcmRsZXNzIG9mCioJIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIDFzdCBoY2ZfZ2V0X2luZm8uIFRoZSBhc3N1bXB0aW9ucyBhcmU6CioJICAtIGlmIGFueSBjYWxsIGZhaWxzLCB0aGV5IGFsbCBmYWlsLCBzbyByZW1lbWJlcmluZyB0aGUgcmVzdWx0IG9mIHRoZSAxc3QgY2FsbCBpcyBhZGVxdWF0ZQoqCSAgLSBhIGZhaWxpbmcgY2FsbCB3aWxsIG92ZXJ3cml0ZSB0aGUgTC1maWVsZCB3aXRoIGEgMHgwMDAwIHZhbHVlLCB3aGljaCBzZXJ2aWNlcyBib3RoIGFzIGFuCioJCWVycm9yIGluZGljYXRpb24gZm9yIHRoZSB2YWx1ZXMgY2FjaGVkIGluIHRoZSBJRkIgYXMgbWFraW5nIG1tZF9jaGVja19jb21wIGZhaWwuCioJIEluIGNhc2Ugb2YgSC1JLCB3aGVuIGdldHRpbmcgdGhlIEYvVyBpZGVudGl0eSBmYWlscywgdGhlIEYvVyBpcyBhc3N1bWVkIHRvIGJlIEgtSSBBUCBGL1cgcHJlLWRhdGluZwoqCSB2ZXJzaW9uIDkuMCBhbmQgdGhlIEYvVyBJZGVudGl0eSBhbmQgU3VwcGxpZXIgYXJlIGZha2VkIGFjY29yZGluZ2x5LgoqCSBJbiBjYXNlIG9mIEgtSUksIHRoZSBQcmltYXJ5LCBTdGF0aW9uIGFuZCBBUCBJZGVudGl0eSBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgRi9XIElkZW50aXR5LgoqCSBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBTdXBwbGllciBpbmZvcm1hdGlvbi4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgUFJJIGluZm9ybWF0aW9uIGNhbiBubyBsb25nZXIgYmUKKgkgcmV0cmlldmVkIHdoZW4gYSBUZXJ0aWFyeSBydW5zLiBUbyBhY2NvbW1vZGF0ZSBNU0ZzIGFuZCBVdGlsaXRpZXMgd2hvIGRlcGVuZCBvbiBQUkkgaW5mb3JtYXRpb24gYmVpbmcKKgkgYXZhaWxhYmxlIGF0IGFueSB0aW1lLCB0aGlzIGluZm9ybWF0aW9uIGlzIGNhY2hlZCBpbiB0aGUgSUZCLiBJbiB0aGlzIGNhY2hlIHRoZSBnZW5lcmljICJGL1ciIHZhbHVlIG9mCioJIHRoZSB0eXAtZmllbGRzIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHNwZWNpZmljIChsZWdhY3kpICJQUkkiIHZhbHVlcy4gVG8gYWN0dWFsbHkgcmUtcm91dGUgdGhlIChsZWdhY3kpCioJIFBSSSByZXF1ZXN0IHZpYSBoY2ZfZ2V0X2luZm8sIHRoZSB4eHh4LXRhYmxlIG11c3QgYmUgc2V0LiAgSW4gY2FzZSBvZiBILUksIHRoaXMgY2FjaGluZywgbW9kaWZ5aW5nIGFuZAoqCSByZS1yb3V0aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBQUkkgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSBkaXJlY3RseSBmcm9tIHRoZSBOSUMuIEZvcgoqCSBjb25zaXN0ZW5jeSB0aGUgY2FjaGluZyBmaWVsZHMgaW4gdGhlIElGQiBhcmUgZmlsbGVkIHdpdGggdGhlIFBSSSBpbmZvcm1hdGlvbiBhbnl3YXkuCioxODogbWRkX2NoZWNrX2NvbXAoKSBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIFN1cHBsaWVyIFZhcmlhbnQgYW5kIFJhbmdlIG9mIHRoZSBIb3N0LVMvVyBJL0YgKEhTSSkgYW5kIHRoZQoqCVByaW1hcnkgRmlybXdhcmUgVmFyaWFudCBhbmQgUmFuZ2UgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgSENGLiAgSWYgZWl0aGVyIG9mCioJdGhlc2UgdGVzdHMgZmFpbHMsIHRoZSBDQVJEX1NUQVRfSU5DT01QX1BSSSBiaXQgb2YgSUZCX0NhcmRTdGF0IGlzIHNldAoqCU5vdGU6IFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBwcmltYXJ5IGV4Y2VwdCBkdXJpbmcgcHJvZHVjdGlvbiwgc28gdGhpcyBtYWtlcyB0aGUgSENGIGluIGl0cyBjdXJyZW50IGZvcm0KKgl1bnN1aXRhYmxlIGZvciBtYW51ZmFjdHVyaW5nIHRlc3Qgc3lzdGVtcyBsaWtlIHRoZSBGVFMuIFRoaXMgY2FuIGJlIHJlbWVkaWVkIGJ5IGFuIGFkZGluZyBhIHRlc3QgbGlrZQoqCWlmYnAtPklGQl9QUklTdXAuaWQgPT0gQ09NUF9JRF9QUkkKKjIwOiBJbiBjYXNlIHRoZXJlIGlzIFRlcnRpYXJ5IEYvVyBhbmQgdGhpcyBGL1cgaXMgU3RhdGlvbiBGL1csIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgU3RhdGlvbgoqCUZpcm13YXJlIGZ1bmN0aW9uIGFzIHJldHJpZXZlZCBmcm9tIHRoZSBIZXJtZXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkKKgl0aGlzIEhDRi4KKglOb3RlOiA7PyB0aGUgdGVydGlhcnkgRi9XIGNvbXBhdGliaWxpdHkgY2hlY2tzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBESEYsIHdoaWNoIGFscmVhZHkgaGFzIGNoZWNrZWQgdGhlCioJQ0ZJIGFuZCBNRkkgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgTklDIGJlZm9yZSB0aGUgaW1hZ2Ugd2FzIGRvd25sb2FkZWQuCioyODogSW4gY2FzZSBvZiBub24tUHJpbWFyeSBGL1c6IGFsbG9jYXRlcyBhbmQgYWNrbm93bGVkZ2UgYSAoVFggb3IgTm90aWZ5KSBGSUQgYW5kIGFsbG9jYXRlcyB3aXRob3V0CioJYWNrbm93bGVkZ2UgYW5vdGhlciAoVFggb3IgTm90aWZ5KSBGSUQgKHRoZSBzby1jYWxsZWQgMS41IGFsbG9jIHNjaGVtZSkgd2l0aCB0aGUgZm9sbG93aW5nIHN0ZXBzOgoqCS0gZXhlY3V0ZSB0aGUgYWxsb2NhdGUgY29tbWFuZCBieSBjYWxsaW5nIGNtZF9leGUKKgktIHdhaXQgdGlsbCBlaXRoZXIgdGhlIGFsbG9jIGV2ZW50IG9yIGEgdGltZS1vdXQgb2NjdXJzCioJLSByZWdhcmRsZXNzIHdoZXRoZXIgdGhlIGFsbG9jIGV2ZW50IG9jY3VycywgY2FsbCBnZXRfZmlkIHRvCioJICAtIHJlYWQgdGhlIEZJRCBhbmQgc2F2ZSBpdCBpbiBJRkJfUnNjSW5kIHRvIGJlIHVzZWQgYXMgInNwYXJlIEZJRCIKKgkgIC0gYWNrbm93bGVkZ2UgdGhlIGFsbG9jIGV2ZW50CioJICAtIGRvIGFub3RoZXIgImhhbGYiIGFsbG9jYXRlIHRvIGNvbXBsZXRlIHRoZSAiMS41IEFsbG9jIHNjaGVtZSIKKgkgIE5vdGUgdGhhdCBhYm92ZSAzIHN0ZXBzIGRvIG5vdCBoYXJtIGFuZCB0aHVzIGdpdmUgdGhlICJjaGVhcGVzdCIgYWNjZXB0YWJsZSBzdHJhdGVneS4KKgkgIElmIGEgdGltZS1vdXQgb2NjdXJyZWQsIHRoZW4gcmVwb3J0IHRpbWUgb3V0IHN0YXR1cyAoYWZ0ZXIgYWxsKQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludAppbml0KCBJRkJQIGlmYnAgKQp7CgppbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0lOSVQsIDAgKQoKCWlmYnAtPklGQl9DYXJkU3RhdCA9IDA7CQkJCQkJCQkJCQkJCQkJCQkJCS8qIDIqLwoJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7IAkJCQkJCQkJCQkJLyogNCovCglJRl9QUk9UX1RJTUUoIGNhbGlicmF0ZSggaWZicCApOyApIAkJCQkJCQkJCQkJCQkvKjEwKi8KI2lmIDAgLy8gT09SCglpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSAyOwkJCQkJCQkvL21pc3VzZSB0aGUgSUZCIHNwYWNlIGZvciBhIHB1dAoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX1RJQ0tfVElNRTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPSAoMTAwMCoxMDAwKS8xMDI0ICsgMTsJLy9yb3VnaGx5IDEgc2Vjb25kCgloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKI2VuZGlmIC8vIE9PUgoJaWZicC0+SUZCX0ZXSWRlbnRpdHkubGVuID0gc2l6ZW9mKENGR19GV19JREVOVElUWV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX0ZXX0lERU5USVRZOwoJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgKi8KI2lmIEhDRl9CSUdfRU5ESUFOCglpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmFyaWFudCAgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZhcmlhbnQgKTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yICk7CglpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLwoJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsJCQkJCQkJCQkJCQkJCQkJCQkvKjE2Ki8KCQlpZmJwLT5JRkJfSFNJU3VwLmxlbiA9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CgkJaWZicC0+SUZCX0hTSVN1cC50eXAgPSBDRkdfTklDX0hTSV9TVVBfUkFOR0U7CgkJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfSFNJU3VwLmxlbiApOwovKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAsIEJVVCBhY2NvcmRpbmcgdG8gYSByZXBvcnQgb2YgYSBCRS11c2VyIGl0IGlzCiAqIHNob3VsZCBiZSByZXNvbHZlZCBpbiB0aGUgV0FSUCByZWxlYXNlCiAqIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1ha2UgdWdseSBidXQgdW5uZWNlc3NhcnkgY29kZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgZXZlbiBmb3IgTEUsCiAqIGl0IGlzIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgKi8KI2lmIEhDRl9CSUdfRU5ESUFOCgkJaWZicC0+SUZCX0hTSVN1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5yb2xlICk7CgkJaWZicC0+SUZCX0hTSVN1cC5pZCAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5pZCApOwoJCWlmYnAtPklGQl9IU0lTdXAudmFyaWFudCA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudmFyaWFudCApOwoJCWlmYnAtPklGQl9IU0lTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuYm90dG9tICk7CgkJaWZicC0+SUZCX0hTSVN1cC50b3AgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC50b3AgKTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCgkJaWZicC0+SUZCX0ZXU3VwLmxlbiA9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CgkJaWZicC0+SUZCX0ZXU3VwLnR5cCA9IENGR19GV19TVVBfUkFOR0U7CgkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0ZXU3VwLmxlbiApOwovKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLwojaWYgSENGX0JJR19FTkRJQU4KCQlpZmJwLT5JRkJfRldTdXAucm9sZSAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5yb2xlICk7CgkJaWZicC0+SUZCX0ZXU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAuaWQgKTsKCQlpZmJwLT5JRkJfRldTdXAudmFyaWFudCA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC52YXJpYW50ICk7CgkJaWZicC0+SUZCX0ZXU3VwLmJvdHRvbSAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAuYm90dG9tICk7CgkJaWZicC0+SUZCX0ZXU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudG9wICk7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgoKCQlpZiAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX1BSSSApIHsJCQkJCQkJCQkJCQkvKiAyMCovCmludCBpID0gc2l6ZW9mKCBDRkdfRldfSURFTlRJVFlfU1RSQ1QpICsgc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QgKTsKCQkJd2hpbGUgKCBpLS0gKSAoKGhjZl84KikoJmlmYnAtPklGQl9QUklJZGVudGl0eSkpW2ldID0gKChoY2ZfOCopKCZpZmJwLT5JRkJfRldJZGVudGl0eSkpW2ldOwoJCQlpZmJwLT5JRkJfUFJJSWRlbnRpdHkudHlwID0gQ0ZHX1BSSV9JREVOVElUWTsKCQkJaWZicC0+SUZCX1BSSVN1cC50eXAgPSBDRkdfUFJJX1NVUF9SQU5HRTsKCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVRdID0gJmlmYnAtPklGQl9QUklJZGVudGl0eS5sZW47CgkJCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUKzFdID0gJmlmYnAtPklGQl9QUklTdXAubGVuOwoJCX0KCQlpZiAoICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLCAmaWZicC0+SUZCX0hTSVN1cCkJCQkJIC8qIDIyKi8KI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKLy87PyB0aGUgUFJJIGNvbXBhdGliaWxpdHkgY2hlY2sgaXMgb25seSByZWxldmFudCBmb3IgREhGCgkJCSB8fCAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSwgJmlmYnAtPklGQl9QUklTdXApCiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKCQkgICApIHsKCQkJaWZicC0+SUZCX0NhcmRTdGF0ID0gQ0FSRF9TVEFUX0lOQ09NUF9QUkk7CgkJCXJjID0gSENGX0VSUl9JTkNPTVBfUFJJOwoJCX0KCQlpZiAoICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfU1RBICYmCSFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLCAmaWZicC0+SUZCX0ZXU3VwKSApIHx8CgkJCSAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX0FQRiAmJiAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiwgJmlmYnAtPklGQl9GV1N1cCkgKQoJCSAgICkgewkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDI0ICovCgkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfSU5DT01QX0ZXOwoJCQlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOwoJCX0KCX0KI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyOCAqLwoJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID49IENPTVBfSURfRldfU1RBICkgewpQUk9UX0NOVF9JTkkKCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCQkqIHJsYXY6IHRoZSBETUEgZW5naW5lIG5lZWRzIHRoZSBob3N0IHRvIGNhdXNlIGEgJ2hhbmdpbmcgYWxsb2MgZXZlbnQnIGZvciBpdCB0byBjb25zdW1lLgoJCSogbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgSENGLCB0aGlua2luZyBhYm91dCBoY2ZfZW5hYmxlLi4uCgkJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FMTE9DLCAwICk7Ci8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1Ci8vCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsJLy9sZXQncyBob3BlIHRoYXQgYnkgdGhlIHRpbWUgaGNmX3NlbmRfbXNnIGlzYSBjYWxsZWQsIHRoZXJlIHdpbGwgYmUgYSBGSUQKLy8jZWxzZQoJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUxMT0MpID09IDAgKTsKCQkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQocHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkgKSAvKk5PUCovOykKI2lmIEhDRl9ETUEKCQkJaWYgKCAhICggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgKQojZW5kaWYgLy8gSENGX0RNQQoJCQl7CgkJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOwoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kLCAwICkKCQkJCWNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKCQkJCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCA9PSAwICkgcmMgPSBIQ0ZfRVJSX1RJTUVfT1VUOyApCgkJCX0KCQl9Ci8vI2VuZGlmIC8vIEFMTE9DXzE1Cgl9CiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0lOSVQgKQoJcmV0dXJuIHJjOwp9IC8vIGluaXQKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGlzcl9pbmZvKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWhhbmRsZXMgbGluayBldmVudHMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKjE6CUZpcnN0IHRoZSBGSUQgbnVtYmVyIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgSW5mb0V2ZW50IGlzIGRldGVybWluZWQuCioJTm90ZSB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZSB6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4KKglOZXh0IHRoZSBMLWZpZWxkIGFuZCB0aGUgVC1maWVsZCBhcmUgZmV0Y2hlZCBpbnRvIHNjcmF0Y2ggYnVmZmVyIGluZm8uCioyOglJbiBjYXNlIG9mIHRhbGxpZXMsIHRoZSAxNiBiaXRzIEhlcm1lcyB2YWx1ZXMgYXJlIGFjY3VtdWxhdGVkIGluIHRoZSBJRkIgaW50byAzMiBiaXRzIHZhbHVlcy4gSW5mb1swXQoqCWlzIChleHBlY3RlZCB0byBiZSkgSENGX05JQ19UQUxfQ05UICsgMS4gVGhlIGNvbnRyYXB0aW9uICJ3aGlsZSAoIGluZm9bMF0tLSA+MSApIiByYXRoZXIgdGhhbgoqCSJ3aGlsZSAoIC0taW5mb1swXSApIiBpcyB1c2VkIGJlY2F1c2UgaXQgaXMgZGFuZ2Vyb3VzIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBWYWx1ZSBmaWVsZCBieQoqCWRlY3JlbWVudGluZyBpbmZvWzBdLiBBcyBhIHJlc3VsdCBvZiBhIGJ1ZyBpbiBzb21lIHZlcnNpb24gb2YgdGhlIEYvVywgaW5mb1swXSBtYXkgYmUgMCwgcmVzdWx0aW5nCioJaW4gYSB2ZXJ5IGxvbmcgbG9vcCBpbiB0aGUgcHJlLWRlY3JlbWVudCBsb2dpYy4KKjQ6CUluIGNhc2Ugb2YgYSBsaW5rIHN0YXR1cyBmcmFtZSwgdGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCB0byB0aGUgSUZCIGZpZWxkIElGQl9saW5rU3RhdAoqNjoJQWxsIG90aGVyIHRoYW4gVGFsbGllcyAoaW5jbHVkaW5nICJ1bmtub3duIiBvbmVzKSBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoZSBNU0YKKgl2aWEgQ0ZHX1JJRF9MT0cuIElmIGEgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIHNlbGVjdGlvbiBzZXQgaGFzIHRoZSB3aWxkLWNhcmQgdHlwZSAoaS5lIG5vbi1OVUxMIGJ1ZmZlcgoqCXBvaW50ZXIgYXQgdGhlIHRlcm1pbmF0aW5nIHplcm8tdHlwZSksIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlICh0eXBlLXNwZWNpZmljKSBsb2cgYnVmZmVyLgoqCU5vdGUgdGhhdCB0byBhY2N1bXVsYXRlIHRhbGxpZXMgaW50byBJRkIgQU5EIHRvIGxvZyB0aGVtIG9yIHRvIGxvZyBhIGZyYW1lIHdoZW4gYSBzcGVjaWZpYyBtYXRjaCBvY2N1cmVzCioJQU5EIGJhc2VkIG9uIHRoZSB3aWxkLWNhcmQgc2VsZWN0aW9uLCB5b3UgaGF2ZSB0byBjYWxsIHNldHVwX2JhcCBhZ2FpbiBhZnRlciB0aGUgMXN0IGNvcHkuCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZAppc3JfaW5mbyggSUZCUCBpZmJwICkKewpoY2ZfMTYJaW5mb1syXSwgZmlkOwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwpSSURfTE9HUAlyaWRwID0gaWZicC0+SUZCX1JJRExvZ3A7CS8vTlVMTCBvciBwb2ludGVyIHRvIGFycmF5IG9mIFJJRF9MT0cgc3RydWN0dXJlcyAodGVybWluYXRlZCBieSB6ZXJvIHR5cCkKI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKCglIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPICk7CQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KCWZpZCA9IElQVyggSFJFR19JTkZPX0ZJRCApOwoJREFXQV9aRVJPX0ZJRCggSFJFR19JTkZPX0ZJRCApCglpZiAoIGZpZCApIHsKCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fSU4gKTsKCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWluZm8sIDQgQkVfUEFSKDIpICk7CgkJSENGQVNTRVJUKCBpbmZvWzBdIDw9IEhDRl9NQVhfTFRWICsgMSwgTUVSR0VfMiggaW5mb1sxXSwgaW5mb1swXSApICkgIC8vOz8gYSBzbWFsbGVyIHZhbHVlIG1ha2VzIG1vcmUgc2Vuc2UKI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19OSUMJCS8vSGVybWVzIHRhbGx5IHN1cHBvcnQKCQlpZiAoIGluZm9bMV0gPT0gQ0ZHX1RBTExJRVMgKSB7CmhjZl8zMgkqcDsKLyoyKi8JCWlmICggaW5mb1swXSA+IEhDRl9OSUNfVEFMX0NOVCApIHsKCQkJCWluZm9bMF0gPSBIQ0ZfTklDX1RBTF9DTlQgKyAxOwoJCQl9CgkJCXAgPSAoaGNmXzMyKikmaWZicC0+SUZCX05JQ19UYWxsaWVzOwoJCQl3aGlsZSAoIGluZm9bMF0tLSA+MSApICpwKysgKz0gSVBXKCBIUkVHX0RBVEFfMSApOwkvL3JlcXVlc3QgbWF5IHJldHVybiB6ZXJvIGxlbmd0aAoJCX0KCQllbHNlCiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKCQl7Ci8qNCovCQlpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKCQkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IElQVyggSFJFR19EQVRBXzEgKTsKCQkJfQojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwovKjYqLwkJd2hpbGUgKCAxICkgewoJCQkJaWYgKCByaWRwLT50eXAgPT0gMCB8fCByaWRwLT50eXAgPT0gaW5mb1sxXSApIHsKCQkJCQlpZiAoIHJpZHAtPmJ1ZnAgKSB7CgkJCQkJCUhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApCgkJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oKGhjZl8xNikocmlkcC0+bGVuIC0gMSksIGluZm9bMF0gKTsgCS8vc2F2ZSBMCgkJCQkJCXJpZHAtPmJ1ZnBbMV0gPSBpbmZvWzFdOwkJCQkJCS8vc2F2ZSBUCgkJCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJnJpZHAtPmJ1ZnBbMl0sIChyaWRwLT5idWZwWzBdIC0gMSkqMiBCRV9QQVIoMCkgKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlyaWRwKys7CgkJCX0KI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKCQl9CgkJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7Cgl9CglyZXR1cm47Cn0gLy8gaXNyX2luZm8KI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgovLwovLwovLyAjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCi8vIC8qNCovCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgewovLyAJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCA9IElQVyggSFJFR19EQVRBXzEgKSB8IENGR19MSU5LX1NUQVRfQ0hBTkdFOwkvL2NvcnJ1cHRzIEJBUCAhISA7PwovLyAJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7IC8vOz8gdG8gYmUgb2Jzb2xldGVkCi8vIAkJCXByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKLy8gCQkJaWYgKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9DT05ORUNURUQgKSA9PSAwICkgeyAJLy9ldmVuIHZhbHVlcyBhcmUgZGlzY29ubmVjdGVkIGV0Yy4KLy8gCQkJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCi8vIAkJCQlwcmludGsoICI8NT5pc3JfaW5mbzogQXdhaXRDb25uZWN0aW9uIHBoYXNlIHN0YXJ0ZWQsIElGQl9UaWNrQ250ID0gMFxuIiApOwkJLy87P3JlbW92ZSBtZSAxIGRheQovLyAJCQl9Ci8vICNlbmRpZiAvLyBIQ0ZfRERTCi8vIAkJfQovLyAjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwovLyAvKjYqLwl3aGlsZSAoIDEgKSB7Ci8vIAkJCWlmICggcmlkcC0+dHlwID09IDAgfHwgcmlkcC0+dHlwID09IGluZm9bMV0gKSB7Ci8vIAkJCQlpZiAoIHJpZHAtPmJ1ZnAgKSB7Ci8vIAkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKLy8gCQkJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMiwgSU9fSU4gKTsJCQkvL3Jlc3RvcmUgQkFQIGZvciB0YWxsaWVzLCBsaW5rc3RhdCBhbmQgc3BlY2lmaWMgdHlwZSBmb2xsb3dlZCBieSB3aWxkIGNhcmQKLy8gCQkJCQlyaWRwLT5idWZwWzBdID0gbWluKCByaWRwLT5sZW4gLSAxLCBpbmZvWzBdICk7IAkvL3NhdmUgTAovLyAJCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJnJpZHAtPmJ1ZnBbMV0sIHJpZHAtPmJ1ZnBbMF0qMiBCRV9QQVIoMCkgKTsKLy8gCQkJCX0KLy8gCQkJCWJyZWFrOyAvLzs/dGhpcyBicmVhayBpcyBubyBsb25nZXIgbmVlZGVkIGR1ZSB0byBzZXR1cF9iYXAgYnV0IGxldHMgY29uY2VudHJhdGUgb24gRERTIGZpcnN0Ci8vIAkJCX0KLy8gCQkJcmlkcCsrOwovLyAJCX0KLy8gI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKLy8gCX0KLy8gCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gfCBIQ0ZfVFJBQ0VfRVhJVCApOwovLwovLwovLwovLwovLwlyZXR1cm47Ci8vfSAvLyBpc3JfaW5mbwovLyNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBtZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQoqLlBVUlBPU0UJCWZpbHRlcnMgYXNzZXJ0IG9uIGxldmVsIGFuZCBpbnRlcmZhY2VzIHRvIHRoZSBNU0Ygc3VwcGxpZWQgbXNmX2Fzc2VydCByb3V0aW5lLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbGluZV9udW1iZXIJbGluZSBudW1iZXIgb2YgdGhlIGxpbmUgd2hpY2ggY2F1c2VkIHRoZSBhc3NlcnQKKglxCQkJcXVhbGlmaWVyLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBnaXZlIGEgY2x1ZSBhYm91dCB0aGUgcHJvYmxlbQoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCiogbWRkX2Fzc2VydCBoYXMgYmVlbiB0aHJvdWdoIGEgdHVybW9pbCwgcmVuYW1pbmcgaGNmX2Fzc2VydCB0byBhc3NlcnQgYW5kIGhjZl9hc3NlcnQgYWdhaW4gYW5kIHN1cHBvcnRpbmcgb2ZmCiogYW5kIG9uIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwgYW5kIG90aGVyICggaW1tYXR1cmUgKSBNb2R1bGFyRHJpdmVyRGV2ZWxvcG1lbnQgbW9kdWxlcyBsaWtlIERIRiBhbmQKKiBNTUQuCiAqICEhISEgVGhlIGFzc2VydCByb3V0aW5lIGlzIG5vdCBhbiBoY2ZfLi4uLi4gcm91dGluZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBNU0YsCiAqCQlob3dldmVyIGl0IGlzIGNhbGxlZCBmcm9tIG1tZC5jIGFuZCBkaGYuYywgc28gaXQgbXVzdCBiZSBleHRlcm5hbC4KICoJCVRvIHByZXZlbnQgbmFtZXNwYWNlIHBvbGx1dGlvbiBpdCBuZWVkcyBhIHByZWZpeCwgdG8gcHJldmVudCB0aGF0IE1TRiBwcm9ncmFtbWVycyB0aGluayB0aGF0CiAqCQl0aGV5IGFyZSBhbGxvd2VkIHRvIGNhbGwgdGhlIGFzc2VydCBsb2dpYywgdGhlIHByZWZpeCBIQ0YgY2FuJ3QgYmUgdXNlZCwgc28gTUREIGlzIHNlbGVjdGVkISEhIQogKgoqIFdoZW4gY2FsbGVkIGZyb20gdGhlIERIRiBtb2R1bGUgdGhlIGxpbmUgbnVtYmVyIGlzIGluY3JlbWVudGVkIGJ5IERIRl9GSUxFX05BTUVfT0ZGU0VUIGFuZCB3aGVuIGNhbGxlZCBmcm9tCiogdGhlIE1NRCBtb2R1bGUgYnkgTU1EX0ZJTEVfTkFNRV9PRkZTRVQuCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBIQ0ZfQVNTRVJUCnZvaWQKbWRkX2Fzc2VydCggSUZCUCBpZmJwLCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8zMiBxICkKewpoY2ZfMTYJcnVuX3RpbWVfZmxhZyA9IGlmYnAtPklGQl9Bc3NlcnRMdmw7CgoJaWYgKCBydW5fdGltZV9mbGFnIC8qID4gOz8/Pz8/PyAqLyApIHsgLy9wcmV2ZW50IHJlY3Vyc2l2ZSBiZWhhdmlvciwgbGF0ZXIgdG8gYmUgZXh0ZW5kZWQgdG8gbGV2ZWwgZmlsdGVyaW5nCgkJaWZicC0+SUZCX0Fzc2VydFF1YWxpZmllciA9IHE7CgkJaWZicC0+SUZCX0Fzc2VydExpbmUgPSAoaGNmXzE2KWxpbmVfbnVtYmVyOwojaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKCQlpZiAoIGlmYnAtPklGQl9Bc3NlcnRSdG4gKSB7CgkJCWlmYnAtPklGQl9Bc3NlcnRSdG4oIGxpbmVfbnVtYmVyLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UsIHEgKTsKCQl9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIC8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1NXX1NVUAoJCU9QVyggSFJFR19TV18yLCBsaW5lX251bWJlciApOwoJCU9QVyggSFJFR19TV18yLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgKTsKCQlPUFcoIEhSRUdfU1dfMiwgKGhjZl8xNilxICk7CgkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpKHEgPj4gMTYgKSApOwojZW5kaWYgLy8gSENGX0FTU0VSVF9TV19TVVAKCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CICYmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIKCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gMDsJCQkJCQkJCQkvLyBwcmV2ZW50IHJlY3Vyc2l2ZSBiZWhhdmlvcgoJCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9Bc3NlcnRTdHJjdCApOwoJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSBydW5fdGltZV9mbGFnOwkJCQkJCS8vIHJlc3RvcmUgYXBwcm9wcmlhdGUgZmlsdGVyIGxldmVsCiNlbmRpZiAvLyBIQ0ZfRVhUX01CIC8gSENGX0FTU0VSVF9NQgoJfQp9IC8vIG1kZF9hc3NlcnQKI2VuZGlmIC8vIEhDRl9BU1NFUlQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKKi5QVVJQT1NFCQl3cml0ZXMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBIb3N0IG1lbW9yeSB0byBOSUMgUkFNLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCioJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAoqCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycwoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgbm90IHlldCB3cml0dGVuIGJ5IHRoZSBwcmV2aW91cyBwdXRfZnJhZyBhbmQgY29weSBsZW4KKiAob3IgbGVuLTEpIGJ5dGVzIGZyb20gYnVmcCB0byBOSUMuCioKKgoqLkRJQUdSQU0KKgoqLk5PVElDRQoqCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCioJQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIHZvaWQKcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKewpoY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKaW50CQkJaTsJCQkJCQkJCQkJCS8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwpoY2ZfMTYJCWo7CglIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKI2lmIEhDRl9CSUdfRU5ESUFOCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQoJSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFXzIoIHdvcmRfbGVuLCBsZW4gKSApCgoJaWYgKCB3b3JkX2xlbiApIHsJCQkJCQkJCQkvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKIAkJCQkJCQkJCQkJCQkJLy8uICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMXN0IGhjZl8xNgoJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsKCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJCQkJCQkJCQkJCQkJLy8uICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQoJCWxlbiAtPSAyOwoJCWJ1ZnAgKz0gMjsKCQlpZiAoIHdvcmRfbGVuID4gMSApIHsJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyB0byBjb252ZXJ0IG1vcmUgdGhhbiAxIHdvcmQgKCBpLmUgMiApCiAJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDJuZCBoY2ZfMTYKCQkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OwkvKmJ1ZnAgaXMgYWxyZWFkeSBpbmNyZW1lbnRlZCBieSAyKi8KCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgdXBkYXRlIHBvaW50ZXIgYW5kIGNvdW50ZXIgYWNjb3JkaW5nbHkKCQkJbGVuIC09IDI7CgkJCWJ1ZnAgKz0gMjsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgoJaSA9IGxlbjsKCWlmICggaSAmJiBpZmJwLT5JRkJfQ2FycnlPdXQgKSB7CQkJCQkvL3NraXAgemVyby1sZW5ndGgKCQlqID0gKCgqYnVmcCk8PDgpICsgKCBpZmJwLT5JRkJfQ2FycnlPdXQgJiAweEZGICk7CgkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCWJ1ZnArKzsgaS0tOwoJCWlmYnAtPklGQl9DYXJyeU91dCA9IDA7Cgl9CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCS8vc2tpcCB6ZXJvLWxlbmd0aCBJL08sIHNpbmdsZSBieXRlIEkvTyBhbmQgSS9PIG5vdCB3b3J0aHdoaWxlIChpLmUuIGxlc3MgdGhhbiA2IGJ5dGVzKWZvciBEVyBsb2dpYwoJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgewpoY2ZfMzIgRkFSCSpwNDsgLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCgkJaWYgKCAoIChoY2ZfMzIpYnVmcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCgkJCWlmICggKGhjZl8zMilidWZwICYgMHgyICkgewkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8vLiAgLiAgLiAgd3JpdGUgYSBzaW5nbGUgd29yZCB0byBnZXQgZG91YmxlIHdvcmQgYWxpZ25lZAoJCQkJaiA9ICood2NpX3JlY29yZHApYnVmcDsJCS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQoJCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwoJCQkJCQkJCQkJCQkJLy8uICAuICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCQkJYnVmcCArPSAyOyBpIC09IDI7CgkJCX0KCQkJCQkJCQkJCQkJCS8vLiAgLiAgd3JpdGUgYXMgbWFueSBkb3VibGUgd29yZCBhcyBwb3NzaWJsZQoJCQlwNCA9IChoY2ZfMzIgRkFSICopYnVmcDsKCQkJaiA9IChoY2ZfMTYpaS80OwoJCQlPVVRfUE9SVF9TVFJJTkdfMzIoIGlvX3BvcnQsIHA0LCBqICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCWJ1ZnAgKz0gaSAmIH4weDAwMDM7CgkJCWkgJj0gMHgwMDAzOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKCQkJCQkJCQkJCQkJCS8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEgd29yZCBsZWZ0CglpZiAoIGkgKSB7CgkJCQkJCQkJCQkJCQkvLy4gIGlmIG9kZCBudW1iZXIgb2YgYnl0ZXMgbGVmdAoJCWlmICggaSAmIDB4MDAwMSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBsZWZ0IG92ZXIgYnl0ZSAoYmVmb3JlIGJ1ZnAgaXMgY29ycnVwdGVkKSBpbiBjYXJyeSwgc2V0IGNhcnJ5IGZsYWcKCQkJaWZicC0+SUZCX0NhcnJ5T3V0ID0gKGhjZl8xNilidWZwW2ktMV0gfCAweDAxMDA7CS8vbm90ZSB0aGF0IGkgYW5kIGJ1ZnAgYXJlIGFsd2F5cyBzaW11bHRhbmVvdXNseSBtb2RpZmllZCwgJmJ1ZnBbaS0xXSBpcyBpbnZhcmlhbnQKCQl9CgkJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQoJCWogPSAoaGNmXzE2KWkvMjsKCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgYnVmcCwgaiApOwoJfQp9IC8vIHB1dF9mcmFnCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIHB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWNsZWFudXAgYWZ0ZXIgcHV0X2ZyYWcgZm9yIHRyYWlsaW5nIG9kZCBieXRlIGFuZCBNSUMgdHJhbnNmZXIgdG8gTklDLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIGZpbmFsaXplIHRoZSBNSUMgY2FsY3VsYXRpb24gd2l0aCB0aGUgcGFkZGluZyBwYXR0ZXJuLCBvdXRwdXQgdGhlIGxhc3QgYnl0ZSAoaWYgYXBwbGljYWJsZSkKKiBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlIE1JQyB0byB0aGUgVHhGUwoqCioKKi5ESUFHUkFNCioyOgkxIGJ5dGUgb2YgdGhlIGxhc3QgcHV0X2ZyYWcgbWF5IGJlIHN0aWxsIGluIElGQl9DYXJyeU91dCAoIHRoZSBwdXRfZnJhZyBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KKgkxIC0gMyBieXRlcyBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX3R4XzMyICggdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCioJVGhlIGNhbGwgdG8gdGhlIE1JQyBjYWxjdWxhdGlvbiByb3V0aW5lIGZlZWRzIHRoZXNlIHJlbWFpbmluZyBieXRlcyAoaWYgYW55KSBvZiBwdXRfZnJhZyBhbmQgdGhlCioJanVzdCBhcyBtYW55IGJ5dGVzIG9mIHRoZSBwYWRkaW5nIGFzIG5lZWRlZCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZS4gTm90ZSB0aGF0IHRoZSAidW5uZWVkZWQiIHBhZAoqCWJ5dGVzIHNpbXBseSBlbmQgdXAgaW4gdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyIGFuZCBhcmUgbmV2ZXIgdXNlZC4KKjg6CXdyaXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIE1JQyBhbmQgcG9zc2libGUgc29tZSBnYXJiYWdlIHRvIE5JQyBSQU0KKglOb3RlOiBpIGlzIGFsd2F5cyA0IChhIGxvb3AtaW52YXJpYW50IG9mIHRoZSB3aGlsZSBpbiBwb2ludCAyKQoqCiouTk9USUNFCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICkKewojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoJaWYgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSAhPSAweEZGRkYpIHsJCS8vaWYgTUlDIGNhbGN1bGF0aW9uIGFjdGl2ZQoJCUNBTENfVFhfTUlDKCBtaWNfcGFkLCA4KTsJCQkJLy8uICBmZWVkICh1cCB0byA4IGJ5dGVzIG9mKSB2aXJ0dWFsIHBhZGRpbmcgdG8gTUlDIGVuZ2luZQoJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgYnl0ZSArIChtb3N0IG9mKSBNSUMKCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWlmYnAtPklGQl9NSUNUeCwgOCBCRV9QQVIoMCkgKTsKCX0KI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQoJcHV0X2ZyYWcoIGlmYnAsIG51bGxfYWRkciwgMSBCRV9QQVIoMCkgKTsJLy93cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGRhdGEgb3IgTUlDIGJ5dGUKfSAvLyBwdXRfZnJhZ19maW5hbGl6ZQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IHB1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiouUFVSUE9TRQkJc3VwcG9ydCByb3V0aW5lIHRvIGhhbmRsZSB0aGUgImJhc2ljIiB0YXNrIG9mIGhjZl9wdXRfaW5mbyB0byBwYXNzIFJJRHMgdG8gdGhlIE5JQy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCWFkZHJlc3MgaW4gTklDIFJBTSB3aGVyZSBMVlQtcmVjb3JkcyBhcmUgbG9jYXRlZAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJPj5wdXRfZnJhZwoqCT4+Y21kX3dhaXQKKgoqLkRFU0NSSVBUSU9OCioKKgoqLkRJQUdSQU0KKjIwOiBkbyBub3Qgd3JpdGUgUklEcyB0byBOSUNzIHdoaWNoIGhhdmUgaW5jb21wYXRpYmxlIEZpcm13YXJlCioyNDogSWYgdGhlIFJJRCBkb2VzIG5vdCBleGlzdCwgdGhlIEwtZmllbGQgaXMgc2V0IHRvIHplcm8uCioJTm90ZSB0aGF0IHNvbWUgUklEcyBjYW4gbm90IGJlIHJlYWQsIGUuZy4gdGhlIHBzZXVkbyBSSURzIGZvciBkaXJlY3QgSGVybWVzIGNvbW1hbmRzIGFuZCBDRkdfREVGQVVMVF9LRVlTCioyODogSWYgdGhlIFJJRCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWwsIHBhc3MgaXQgdG8gdGhlIE5JQyBieSBtZWFucyBvZiBhbiBBY2Nlc3MgV3JpdGUgY29tbWFuZAoqCiouTk9USUNFCioJVGhlIG1lY2hhbmlzbSB0byBIQ0ZfQVNTRVJUIG9uIGludmFsaWQgdHlwLWNvZGVzIGluIHRoZSBMVFYgcmVjb3JkIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6CioJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1JFR19NQikgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwoqCQlhcmUgdmFsaWQuIFRoZXNlIGNvZGVzIGFyZSBhbHJlYWR5IGNvbnN1bWVkIGJ5IGhjZl9wdXRfaW5mby4KKgkgIC0gYWxsIG90aGVyIGNvZGVzIGFyZSBwYXNzZWQgdG8gdGhlIEhlcm1lcy4gQmVmb3JlIHRoZSBwdXQgYWN0aW9uIGlzIGV4ZWN1dGVkLCBoY2ZfZ2V0X2luZm8gaXMgY2FsbGVkCioJCXdpdGggYW4gTFRWIHJlY29yZCB3aXRoIGEgdmFsdWUgb2YgMSBpbgl0aGUgTC1maWVsZCBhbmQgdGhlIGludGVuZGVkIHB1dCBhY3Rpb24gdHlwZSBpbiB0aGUgVHlwLWNvZGUKKgkJZmllbGQuIElmIHRoZSBwdXQgYWN0aW9uIHR5cGUgaXMgdmFsaWQsIGl0IGlzIGFsc28gdmFsaWQgYXMgYSBnZXQgYWN0aW9uIHR5cGUgY29kZSAtIGV4Y2VwdAoqCQlmb3IgQ0ZHX0RFRkFVTFRfS0VZUyBhbmQgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIC0gc28gdGhlIEhDRl9BU1NFUlQgbG9naWMgb2YgaGNmX2dldF9pbmZvIHNob3VsZAoqCQlub3QgY2F0Y2guCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CnB1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cAkpCnsKCmludCByYyA9IEhDRl9TVUNDRVNTOwoKCUhDRkFTU0VSVCggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAsIE1FUkdFXzIoIGx0dnAtPnR5cCwgaWZicC0+SUZCX0NhcmRTdGF0ICkgKQoJSENGQVNTRVJUKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVgsIGx0dnAtPnR5cCApCgoJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJgkJCQkJCQkJCQkJCQkJCQkvKiAyMCovCgkJICggKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICAgICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVggKSB8fAoJCSAgICggQ0ZHX1JJRF9FTkdfTUlOIDw9IGx0dnAtPnR5cCAvKiAmJiBsdHZwLT50eXAgPD0gMHhGRkZGICovICAgICAgICkgICAgICkgKSB7CiNpZiBIQ0ZfQVNTRVJUIC8vRkNDOCwgRkNCMCwgRkNCNCwgRkNCNiwgRkNCNywgRkNCOCwgRkNDMCwgRkNDNCwgRkNCQywgRkNCRCwgRkNCRSwgRkNCRgogewogaGNmXzE2CQl0ID0gbHR2cC0+dHlwOwogTFRWX1NUUkNUIAl4ID0geyAyLCB0LCB7MH0gfTsJCQkJCQkJCQkJCQkJCQkvKjI0Ki8KCWhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJnggKTsKCWlmICggeC5sZW4gPT0gMCAmJgoJCSAoIHQgIT0gQ0ZHX0RFRkFVTFRfS0VZUyAmJiB0ICE9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSAmJgoJCSAgIHQgIT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSAmJgoJCSAgIHQgIT0gQ0ZHX0hBTkRPVkVSX0FERFIgJiYgdCAhPSBDRkdfRElTQVNTT0NJQVRFX0FERFIgJiYKCQkgICB0ICE9IENGR19GQ0JDICYmIHQgIT0gQ0ZHX0ZDQkQgJiYgdCAhPSBDRkdfRkNCRSAmJiB0ICE9IENGR19GQ0JGICYmCgkJICAgdCAhPSBDRkdfREVBVVRIRU5USUNBVEVfQUREUgoJCSApCgkJKSB7CgkJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPnR5cCApCgkJfQogfQojZW5kaWYgLy8gSENGX0FTU0VSVAoKCQlyYyA9IHNldHVwX2JhcCggaWZicCwgbHR2cC0+dHlwLCAwLCBJT19PVVQgKTsKCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWx0dnAsIDIqbHR2cC0+bGVuICsgMiBCRV9QQVIoMikgKTsKLyoyOCovCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BQ0NFU1MgKyBIQ01EX0FDQ0VTU19XUklURSwgbHR2cC0+dHlwICk7CgkJfQoJfQoJcmV0dXJuIHJjOwp9IC8vIHB1dF9pbmZvCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICkKKi5QVVJQT1NFCSAJYWNjdW11bGF0ZXMgYSAoIHNlcmllcyBvZikgYnVmZmVycyBpbnRvIGEgc2luZ2xlIEluZm8gYmxvY2sgaW50byB0aGUgTWFpbEJveC4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCWFkZHJlc3Mgb2Ygc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ0eXBlIiBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgc3ludGhlc2l6ZWQKKgkJCQlhcyBhbiBMVFYgaW50byB0aGUgTWFpbEJveAoqCiouUkVUVVJOUwoqCiouREVTQ1JJUFRJT04KKiBJZiB0aGUgZGF0YSBkb2VzIG5vdCBmaXQgKGluY2x1ZGluZyBubyBNYWlsQm94IGlzIGF2YWlsYWJsZSksIHRoZSBJRkJfTUJUYWxseSBpcyBpbmNyZW1lbnRlZCBhbmQgYW4KKiBlcnJvciBzdGF0dXMgaXMgcmV0dXJuZWQuCiogSENGX0FTU0VSVCBkb2VzIG5vdCBjYXRjaC4KKiBDYWxsaW5nIHB1dF9pbmZvX21iIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBhdmFpbGFibGUsIGlzIGNvbnNpZGVyZWQgYSBkZXNpZ24gZXJyb3IgaW4gdGhlIE1TRi4KKgoqIE5vdGUgdGhhdCB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3QgMSB3b3JkIG9mIHVudXNlZCBzcGFjZSBpbiB0aGUgbWFpbCBib3guCiogQXMgYSBjb25zZXF1ZW5jZToKKiAtIG5vIHByb2JsZW0gaW4gcG9pbnRlciBhcml0aG1ldGljIChNQl9SUCA9PSBNQl9XUCBtZWFucyB1bmFtYmlndW91c2x5IG1haWwgYm94IGlzIGNvbXBsZXRlbHkgZW1wdHkKKiAtIFRoZXJlIGlzIGFsd2F5cyBmcmVlIHNwYWNlIHRvIHdyaXRlIGFuIEwgZmllbGQgd2l0aCBhIHZhbHVlIG9mIHplcm8gYWZ0ZXIgZWFjaCBNQl9JbmZvIGJsb2NrLiAgVGhpcwoqICAgYWxsb3dzIGZvciBhbiBlYXN5IHNjYW4gbWVjaGFuaXNtIGluIHRoZSAiZ2V0IE1CX0luZm8gYmxvY2siIGxvZ2ljLgoqCioKKi5ESUFHUkFNCioxOglDYWxjdWxhdGUgTCBmaWVsZCBvZiB0aGUgTUJJQiwgaS5lLiAxIGZvciB0aGUgVC1maWVsZCArIHRoZSBjdW11bGF0aXZlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnRzLgoqMjoJVGhlIGZyZWUgc3BhY2UgaW4gdGhlIE1haWxCb3ggaXMgY2FsY3VsYXRlZCAoMmE6IGZyZWUgcGFydCBmcm9tIFdyaXRlIFB0ciB0byBSZWFkIFB0ciwgMmI6IGZyZWUgcGFydAoqCXR1cm5zIG91dCB0byB3cmFwIGFyb3VuZCkgLiBJZiB0aGlzIHNwYWNlIHN1ZmZpY2VzIHRvIHN0b3JlIHRoZSBudW1iZXIgb2Ygd29yZHMgcmVmbGVjdGVkIGJ5IGxlbiAoVC1maWVsZAoqCSsgVmFsdWUtZmllbGQpIHBsdXMgdGhlIGFkZGl0aW9uYWwgTWFpbEJveCBJbmZvIEwtZmllbGQgKyBhIHRyYWlsaW5nIDAgdG8gYWN0IGFzIHRoZSBMLWZpZWxkIG9mIGEgdHJhaWxpbmcKKglkdW1teSBvciBlbXB0eSBMVFYgcmVjb3JkLCB0aGVuIGEgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGJ1aWxkIGluIHRoZSBNYWlsQm94IGNvbnNpc3Rpbmcgb2YKKgkgIC0gdGhlIHZhbHVlIGxlbiBpbiB0aGUgZmlyc3Qgd29yZAoqCSAgLSB0eXBlIGluIHRoZSBzZWNvbmQgd29yZAoqCSAgLSBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHNlY29uZCBhbmQgaGlnaGVyIHdvcmQKKgoqNDoJU2luY2UgcHV0X2luZm9fbWIoKSBjYW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwsIHRoZSBJL0YgbXVzdCBiZSByb2J1c3QKKglhZ2FpbnN0IG91dC1vZi1yYW5nZSB2YXJpYWJsZXMuIEFzIGZhaWxzYWZlIGNvZGluZywgdGhlIE1CIHVwZGF0ZSBpcyBza2lwcGVkIGJ5IGNoYW5naW5nIHRsZW4gdG8gMCBpZgoqCWxlbiA9PSAwOyBUaGlzIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhbiBhc3NlcnQgYXMgcmVzdWx0IG9mIHRoZSB2aW9sYXRpb24gb2YgdGhlIG5leHQgaWYgY2xhdXNlLgoqNjoJQ2hlY2sgd2hldGhlciB0aGUgZnJlZSBzcGFjZSBpbiBNYWlsQm94IHN1ZmZpY2VzICh0aGlzIGNvdmVycyB0aGUgY29tcGxldGUgYWJzZW5jZSBvZiB0aGUgTWFpbEJveCkuCioJTm90ZSB0aGF0IGxlbiBpcyB1bnNpZ25lZCwgc28gZXZlbiBNU0YgSS9GIHZpb2xhdGlvbiB3b3JrcyBvdXQgTy5LLgoqCVRoZSAnMicgaW4gdGhlIGV4cHJlc3Npb24gImxlbisyIiBpcyB1c2VkIGJlY2F1c2UgMSB3b3JkIGlzIG5lZWRlZCBmb3IgTCBpdHNlbGYgYW5kIDEgd29yZCBpcyBuZWVkZWQKKglmb3IgdGhlIHplcm8tc2VudGluZWwKKjg6CXVwZGF0ZSBNYWlsQm94IEluZm8gbGVuZ3RoIHJlcG9ydCB0byBNU0Ygd2l0aCAib2xkZXN0IiBNQiBJbmZvIEJsb2NrIHNpemUuIEJlIGNhcmVmdWxsIGhlcmUsIGlmIHlvdSBnZXQKKgloZXJlIGJlZm9yZSB0aGUgTWFpbEJveCBpcyByZWdpc3RlcmVkLCB5b3UgY2FuJ3QgcmVhZCBmcm9tIHRoZSBidWZmZXIgYWRkcmVzc2VkIGJ5IElGQl9NQnAgKGl0IGlzIHRoZQoqCU51bGwgYnVmZmVyKSBzbyBkb24ndCBtb3ZlIHRoaXMgY29kZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIGJ1dCBrZWVwIGl0IHdoZXJlIHRoZXJlIGlzIGdhcnVhbnRlZWQKKglhIGJ1ZmZlci4KKgoqLk5PVElDRQoqCWJvdW5kYXJ5IHRlc3RpbmcgZGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IElGQl9NQlNpemUgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIG5vIE1haWxCb3ggaXMgcHJlc2VudCwKKglhbmQgdG8gYSBsZXNzZXIgZGVncmVlLCB0aGF0IElGQl9NQldwID0gSUZCX01CUnAgPSAwCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCgpIQ0ZfU1RBVElDIGludApwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICkKewoKaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmXzE2CQlpOwkJCQkJCS8vd29yayBjb3VudGVyCmhjZl8xNgkJKmRwOwkJCQkJLy9kZXN0aW5hdGlvbiBwb2ludGVyIChpbiBNYWlsQm94KQp3Y2lfcmVjb3JkcAlzcDsJCQkJCQkvL3NvdXJjZSBwb2ludGVyCmhjZl8xNgkJbGVuOwkJCQkJLy90b3RhbCBsZW5ndGggdG8gY29weSB0byBNYWlsQm94CmhjZl8xNgkJdGxlbjsJCQkJCS8vZnJlZSBsZW5ndGgvd29ya2luZyBsZW5ndGgvb2Zmc2V0IGluIFdNUCBmcmFtZQoKCWlmICggaWZicC0+SUZCX01CcCA9PSBOVUxMICkgcmV0dXJuIHJjOyAgLy87P25vdCBzdWZmaWNpZW50CglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NQnAgIT0gTlVMTCwgMCApCQkJCQkvLyEhIWJlIGNhcmVmdWwsIGRvbid0IGdldCBpbnRvIGFuIGVuZGxlc3MgcmVjdXJzaW9uCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NQlNpemUsIDAgKQoKCWxlbiA9IDE7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCglmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7CgkJbGVuICs9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwoJfQoJaWYgKCBpZmJwLT5JRkJfTUJScCA+IGlmYnAtPklGQl9NQldwICkgewoJCXRsZW4gPSBpZmJwLT5JRkJfTUJScCAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJCS8qIDJhKi8KCX0gZWxzZSB7CgkJaWYgKCBpZmJwLT5JRkJfTUJScCA9PSBpZmJwLT5JRkJfTUJXcCApIHsKCQkJaWZicC0+SUZCX01CUnAgPSBpZmJwLT5JRkJfTUJXcCA9IDA7CS8vIG9wdGltaXplIFdyYXBwaW5nCgkJfQoJCXRsZW4gPSBpZmJwLT5JRkJfTUJTaXplIC0gaWZicC0+SUZCX01CV3A7CQkJCQkJCQkJCQkJCQkvKiAyYiovCgkJaWYgKCAoIHRsZW4gPD0gbGVuICsgMiApICYmICggbGVuICsgMiA8IGlmYnAtPklGQl9NQlJwICkgKSB7CS8vaWYgdHJhaWxpbmcgc3BhY2UgaXMgdG9vIHNtYWxsIGJ1dAoJCQkJCQkJCQkJCQkJCQkJCS8vCSBsZWFkaW5nIHNwYWNlIGlzIHN1ZmZpY2llbnRseSBsYXJnZQoJCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDB4RkZGRjsJCQkJCS8vZmxhZyBkdW1teSBMVFYgdG8gZmlsbCB0aGUgdHJhaWxpbmcgc3BhY2UKCQkJaWZicC0+SUZCX01CV3AgPSAwOwkJCQkJCQkJCQkvL3Jlc2V0IFdyaXRlUG9pbnRlciB0byBiZWdpbiBvZiBNYWlsQm94CgkJCXRsZW4gPSBpZmJwLT5JRkJfTUJScDsJCQkJCQkJCQkvL2dldCBuZXcgYXZhaWxhYmxlIHNwYWNlIHNpemUKCQl9Cgl9CglkcCA9ICZpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXTsKCWlmICggbGVuID09IDAgKSB7CgkJdGxlbiA9IDA7IC8vOz8gd2hhdCBpcyB0aGlzIGdvb2QgZm9yCgl9CglpZiAoIGxlbiArIDIgPj0gdGxlbiApewkJCQkJCQkJCQkJCQkJCQkJCQkJLyogNiAqLwoJCS8vRG8gTm90IEFTU0VSVCwgdGhpcyBpcyBhIG5vcm1hbCBjb25kaXRpb24KCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmTUIrKzsgKSAvKk5PUCB0byBjb3ZlciBhZ2FpbnN0IGFuYWxvbWllcyB3aXRoIGVtcHR5IGNvbXBvdW5kKi87CgkJcmMgPSBIQ0ZfRVJSX0xFTjsKCX0gZWxzZSB7CgkJKmRwKysgPSBsZW47CQkJCQkJCQkJLy93cml0ZSBMZW4gKD0gc2l6ZSBvZiBUK1YgaW4gd29yZHMgdG8gTUJfSW5mbyBibG9jawoJCSpkcCsrID0gbHR2cC0+YmFzZV90eXA7CQkJCQkJCS8vd3JpdGUgVHlwZSB0byBNQl9JbmZvIGJsb2NrCgkJaWZicC0+SUZCX01CV3AgKz0gbGVuICsgMTsJCQkJCQkvL3VwZGF0ZSBXcml0ZVBvaW50ZXIgb2YgTWFpbEJveAoJCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsJCQkJLy8gcHJvY2VzcyBlYWNoIG9mIHRoZSBmcmFnbWVudHMKCQkJc3AgPSBsdHZwLT5mcmFnX2J1ZltpXS5mcmFnX2FkZHI7CgkJCWxlbiA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwoJCQl3aGlsZSAoIGxlbi0tICkgKmRwKysgPSAqc3ArKzsKCQl9CgkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAwOwkJCQkvL3RvIGFzc3VyZSBnZXRfaW5mbyBmb3IgQ0ZHX01CX0lORk8gc3RvcHMKCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CQkJCQkJCQkJCQkvKiA4ICovCgl9CglyZXR1cm4gcmM7Cn0gLy8gcHV0X2luZm9fbWIKCiNlbmRpZiAvLyBIQ0ZfRVhUX01CCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IHNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCiouUFVSUE9TRQkJc2V0IHVwIGRhdGEgYWNjZXNzIHRvIE5JQyBSQU0gdmlhIEJBUF8xLgoqCiouQVJHVU1FTlRTCioJaWZicAkJCWFkZHJlc3Mgb2YgSS9GIEJsb2NrCioJZmlkCQkJCUZJRC9SSUQKKglvZmZzZXQJCQkhIWV2ZW4hISBvZmZzZXQgaW4gRklEL1JJRAoqCXR5cGUJCQlJT19JTiwgSU9fT1VUCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MJCQkJCU8uSwoqCUhDRl9FUlJfTk9fTklDCQkJCWNhcmQgaXMgcmVtb3ZlZAoqCUhDRl9FUlJfREVGVU5DVF9USU1FX09VVAlGYXRhbCBtYWxmdW5jdGlvbiBkZXRlY3RlZAoqCUhDRl9FUlJfREVGVU5DVF8uLi4uLgkJaWYgYW5kIG9ubHkgaWYgSUZCX0RlZnVuY3RTdGF0IDw+IDAKKgoqLkRFU0NSSVBUSU9OCioKKiBBIG5vbi16ZXJvIHJldHVybiBzdGF0dXMgaW5kaWNhdGVzOgoqIC0gdGhlIE5JQyBpcyBjb25zaWRlcmVkIG5vbm9wZXJhdGlvbmFsLCBlLmcuIGR1ZSB0byBhIHRpbWUtb3V0IG9mIHNvbWUgSGVybWVzIGFjdGl2aXR5IGluIHRoZSBwYXN0CiogLSBCQVBfMSBjb3VsZCBub3QgcHJvcGVybHkgYmUgaW5pdGlhbGl6ZWQKKiAtIHRoZSBjYXJkIGlzIHJlbW92ZWQgYmVmb3JlIGNvbXBsZXRpb24gb2YgdGhlIGRhdGEgdHJhbnNmZXIKKiBJbiBhbGwgb3RoZXIgY2FzZXMsIGEgemVybyBpcyByZXR1cm5lZC4KKiBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBpbmRpY2F0ZXMgYW4gSC9XIGVycm9yIHdoaWNoIGlzIHZlcnkgbGlrZWx5IHRvIHNpZ25hbCBjb21wbGV0ZSBIL1cgZmFpbHVyZS4KKiBPbmNlIGEgQkFQIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaGFzIG9jY3VycmVkIGFsbCBzdWJzZXF1ZW50IGludGVyYWN0aW9ucyB3aXRoIHRoZSBIZXJtZXMgd2lsbCByZXR1cm4gYQoqICJkZWZ1bmN0IiBzdGF0dXMgdGlsbCB0aGUgSGVybWVzIGlzIHJlLWluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGhjZl9jb25uZWN0LgoqCiogQSBCQVAgaXMgYSBzZXQgb2YgcmVnaXN0ZXJzIChPZmZzZXQsIFNlbGVjdCBhbmQgRGF0YSkgb2ZmZXJpbmcgcmVhZC93cml0ZSBhY2Nlc3MgdG8gYSBwYXJ0aWN1bGFyIEZJRCBvcgoqIFJJRC4gVGhpcyBhY2Nlc3MgaXMgYmFzZWQgb24gYSBhdXRvLWluY3JlbWVudCBmZWF0dXJlLgoqIFRoZXJlIGFyZSB0d28gQkFQcyBidXQgdGhlc2UgZGF5cyB0aGUgSENGIHVzZXMgb25seSBCQVBfMSBhbmQgbGVhdmVzIEJBUF8wIHRvIHRoZSBQQ0kgQnVzbWFzdGVyaW5nIEgvVy4KKgoqIFRoZSBCQVAtbWVjaGFuaXNtIGlzIGJhc2VkIG9uIHRoZSBCdXN5IGJpdCBpbiB0aGUgT2Zmc2V0IHJlZ2lzdGVyIChzZWUgdGhlIEhlcm1lcyBkZWZpbml0aW9uKS4gVGhlIHdhaXRpbmcKKiBmb3IgQnVzeSBtdXN0IG9jY3VyIGJldHdlZW4gd3JpdGluZyB0aGUgT2Zmc2V0IHJlZ2lzdGVyIGFuZCBhY2Nlc3NpbmcgdGhlIERhdGEgcmVnaXN0ZXIuIFRoZQoqIGltcGxlbWVudGF0aW9uIHRvIHdhaXQgZm9yIHRoZSBCdXN5IGJpdCBkcm9wIGFmdGVyIGVhY2ggd3JpdGUgdG8gdGhlIE9mZnNldCByZWdpc3RlciwgaW1wbGllcyB0aGF0IHRoZQoqIHJlcXVpcmVtZW50IHRoYXQgdGhlIEJ1c3kgYml0IGlzIGxvdyAgYmVmb3JlIHRoZSBTZWxlY3QgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgaXMgYXV0b21hdGljYWxseSBtZXQuCiogQkFQLXNldHVwIG1heSBiZSB0aW1lIGNvbnN1bWluZyAoZS5nLiAzODAgdXNlYyBmb3IgbGFyZ2Ugb2Zmc2V0cyBvY2N1cnMgZnJlcXVlbnRseSkuIFRoZSB3YWl0IGZvciBCdXN5IGJpdAoqIGRyb3AgaXMgcHJvdGVjdGVkIGJ5IGEgbG9vcCBjb3VudGVyLCB3aGljaCBpcyBpbml0aWFsaXplZCB3aXRoIElGQl9UaWNrSW5pLCB3aGljaCBpcyBjYWxpYnJhdGVkIGluIGluaXQuCioKKiBUaGUgTklDIEkvRiBpcyBvcHRpbWl6ZWQgZm9yIHdvcmQgdHJhbnNmZXIgYW5kIGNhbiBvbmx5IGhhbmRsZSB3b3JkIHRyYW5zZmVyIGF0IGEgd29yZCBib3VuZGFyeSBpbiBOSUMKKiBSQU0uIFRoZSBpbnRlbmRlZCBzb2x1dGlvbiBmb3IgdHJhbnNmZXIgb2YgYSBzaW5nbGUgYnl0ZSBoYXMgbXVsdGlwbGUgSC9XIGZsYXdzLiBUaGVyZSBoYXZlIGJlZW4gZGlmZmVyZW50CiogUy9XIFdvcmthcm91bmQgc3RyYXRlZ2llcy4gUklEIGFjY2VzcyBpcyBoY2ZfMTYgYmFzZWQgYnkgIm5hdHVyZSIsIHNvIG5vIGJ5dGUgYWNjZXNzIHByb2JsZW1zLiAgRm9yIFR4L1J4CiogRklEIGFjY2VzcywgIHRoZSBieXRlIGxvZ2ljIGJlY2FtZSBvYnNvbGV0ZSBieSBhYnNvcmJpbmcgaXQgaW4gdGhlIGRvdWJsZSB3b3JkIG9yaWVudGVkIG5hdHVyZSBvZiB0aGUgTUlDCiogZmVhdHVyZS4KKgoqCiouRElBR1JBTQoqCioyOgl0aGUgdGVzdCBvbiByYyBjaGVja3Mgd2hldGhlciB0aGUgSENGIHdlbnQgaW50byAiZGVmdW5jdCIgbW9kZSAoIGUuZy4gQkFQIGluaXRpYWxpemF0aW9uIG9yIGEgY2FsbCB0bwoqCWNtZF93YWl0IGRpZCBldmVyIGZhaWwpLgoqNDoJdGhlIHNlbGVjdCByZWdpc3RlciBhbmQgb2Zmc2V0IHJlZ2lzdGVyIGFyZSBzZXQKKgl0aGUgb2Zmc2V0IHJlZ2lzdGVyIGlzIG1vbml0b3JlZCB0aWxsIGEgc3VjY2Vzc2Z1bCBjb25kaXRpb24gKG5vIGJ1c3kgYml0KSBpcyBkZXRlY3RlZCBvciB0aWxsIHRoZQoqCShjYWxpYnJhdGVkKSBwcm90ZWN0aW9uIGNvdW50ZXIgZXhwaXJlcwoqCUlmIHRoZSBjb3VudGVyIGV4cGlyZXMsIHRoaXMgaXMgcmVmbGVjdGVkIGluIElGQl9EZWZ1bmN0U3RhdCwgc28gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0dXBfYmFwIGZhaWwKKglpbW1lZGlhdGVseSAoIHNlZSAyKQoqNjoJaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNhcnJ5IGFzIHVzZWQgYnkgcGV0L2dldF9mcmFnCio4OglIUkVHX09GRlNFVF9FUlIgaXMgaWdub3JlZCBhcyBlcnJvciBiZWNhdXNlOgoqCSBhOiB0aGUgSGVybWVzIGlzIHJvYnVzdCBhZ2FpbnN0IGl0CioJIGI6IGl0IGlzIG5vdCBrbm93biB3aGF0IGNhdXNlcyBpdCAocHJvYmFibHkgYSBidWcpLCBoZW5jZSBubyBzdHJhdGVneSBjYW4gYmUgc3BlY2lmaWVkIHdoaWNoIGxldmVsIGlzCioJCXRvIGhhbmRsZSB0aGlzIGVycm9yIGluIHdoaWNoIHdheS4gSW4gdGhlIHBhc3QsIGl0IGNvdWxkIGJlIGluZHVjZWQgYnkgdGhlIE1TRiBsZXZlbCwgZS5nLiBieSBjYWxsaW5nCioJCWhjZl9yY3ZfbXNnIHdoaWxlIHRoZXJlIHdhcyBubyBSeC1GSUQgYXZhaWxhYmxlLiBTaW5jZSB0aGlzIGlzIGFuIE1TRi1lcnJvciB3aGljaCBpcyBjYXVnaHQgYnkgQVNTRVJULAoqCQl0aGVyZSBpcyBubyBydW4tdGltZSBhY3Rpb24gcmVxdWlyZWQgYnkgdGhlIEhDRi4KKglMdW1waW5nIHRoZSBPZmZzZXQgZXJyb3IgaW4gd2l0aCB0aGUgQnVzeSBiaXQgZXJyb3IsIGFzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgdHVybnMgb3V0IHRvIGJlIGEKKglkaXNhc3RlciBvciBhIGxpZmUgc2F2ZXIsIGp1c3QgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcy4gU2luY2Ugbm8gcHJlZGljdGlvbiBjYW4gYmUKKglkb25lIGFib3V0IHRoZSBmdXR1cmUsIGl0IGlzICJmZWx0IiB0byBiZSB0aGUgYmVzdCBzdHJhdGVneSB0byBpZ25vcmUgdGhpcyBlcnJvci4gT25lIGRheSB0aGUgY29kZSB3YXMKKglhY2NvbXBhbmllZCBieSB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6CioJLy8JaWdub3JlIEhSRUdfT0ZGU0VUX0VSUiwgc29tZW9uZSwgc3VwcG9zZWRseSB0aGUgTVNGIHByb2dyYW1tZXIgOykgbWFkZSBhIGJ1Zy4gU2luY2Ugd2UgZG9uJ3Qga25vdwoqCS8vCXdoYXQgaXMgZ29pbmcgb24sIHdlIG1pZ2h0IGFzIHdlbGwgZ28gb24gLSB1bmRlciBtYW5hZ2VtZW50IHByZXNzdXJlIC0gYnkgaWdub3JpbmcgaXQKKgoqLkVORERPQyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CnNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCnsKUFJPVF9DTlRfSU5JCmludAlyYzsKCglIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPICk7CglyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdDsKCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgewkJCQkJCQkJCQkvKjIqLwoJCU9QVyggSFJFR19TRUxFQ1RfMSwgZmlkICk7CQkJCQkJCQkJCQkJCQkJCS8qNCovCgkJT1BXKCBIUkVHX09GRlNFVF8xLCBvZmZzZXQgKTsKCQlpZiAoIHR5cGUgPT0gSU9fSU4gKSB7CgkJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKCQl9CgkJZWxzZSBpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOwoJCUhDRl9XQUlUX1dISUxFKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSENNRF9CVVNZICk7CgkJSENGQVNTRVJUKCAhKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSFJFR19PRkZTRVRfRVJSICksIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQkJCS8qOCovCgkJaWYgKCBwcm90X2NudCA9PSAwICkgewoJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggZmlkLCBvZmZzZXQgKSApCgkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOwoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJfQoJfQoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyB8IEhDRl9UUkFDRV9FWElUICk7CglyZXR1cm4gcmM7Cn0gLy8gc2V0dXBfYmFwCgo=