Ly8gICB2aW06dHc9MTEwOnRzPTQ6Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZJTEUgICA6CUhDRi5DCioKKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCiogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCiogT3JpZ2luYWw6CTIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKiBPcmlnaW5hbDoJMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCiogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQoqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKiBPcmlnaW5hbDoJMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCiogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQoqCiogQVVUSE9SIDoJTmljbyBWYWxzdGVyCioKKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgoqCiogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCioJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcwoqCioJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqCiogU09GVFdBUkUgTElDRU5TRQoqCiogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwoqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCioKKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCiogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAoqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCiogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKgoqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoqCiogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwoqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQoqICAgIGRpc3RyaWJ1dGlvbi4KKgoqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKgoqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCioKKiBEaXNjbGFpbWVyCioKKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQoqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQoqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwoqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAoqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAoqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKiBEQU1BR0UuCioKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKgoqKiBJbXBsZW1lbnRhdGlvbiBOb3RlcwoqKgoqIC0JYSBsZWFkaW5nIG1hcmtlciBvZiAvLyEgaXMgdXNlZC4gVGhlIHB1cnBvc2Ugb2Ygc3VjaCBhIHNlcXVlbmNlIGlzIHRvIGhlbHAgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdwoqCUFuIGV4YW1wbGUgaXM6CS8vIXJjID0gSENGX1NVQ0NFU1M7CioJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQoqCXByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAoqCWZpcnN0IGdsYW5jZQoqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CioJeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCiogLQlyZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiaGNmLmgiCQkJCS8vIEhDRiBhbmQgTVNGIGNvbW1vbiBpbmNsdWRlIGZpbGUKI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBIQ0Ygc3BlY2lmaWMgaW5jbHVkZSBmaWxlCiNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQoKI2lmICEgZGVmaW5lZCBvZmZzZXRvZgojZGVmaW5lIG9mZnNldG9mKHMsbSkgICAoKHVuc2lnbmVkIGludCkmKCgocyAqKTApLT5tKSkKI2VuZGlmIC8vIG9mZnNldG9mCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQUk9UT1RZUEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQJCQljbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICk7CkhDRl9TVEFUSUMgaW50CQkJaW5pdCggSUZCUCBpZmJwICk7CkhDRl9TVEFUSUMgaW50CQkJcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICk7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCkhDRl9TVEFUSUMgaW50CQkJcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApOwojZW5kaWYgLy8gSENGX0VYVF9NQgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIHZvaWQJCQljYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgTSApOwp2b2lkIAkJCQkJY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7CnZvaWQgCQkJCQljYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKSENGX1NUQVRJQyBpbnQJCQljaGVja19taWMoIElGQlAgaWZicCApOwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgpIQ0ZfU1RBVElDIHZvaWQJCQljYWxpYnJhdGUoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIGludAkJCWNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBoY2ZfMTYJCWdldF9maWQoIElGQlAgaWZicCApOwpIQ0ZfU1RBVElDIHZvaWQJCQlpc3JfaW5mbyggSUZCUCBpZmJwICk7CiNpZiBIQ0ZfRE1BCkhDRl9TVEFUSUMgREVTQ19TVFJDVCoJZ2V0X2ZyYW1lX2xzdChJRkJQIGlmYnAsIGludCB0eF9yeF9mbGFnKTsKI2VuZGlmIC8vIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CS8vY2hhciosIGJ5dGUgY291bnQgKHVzdWFsbHkgZXZlbikKI2lmIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKTsKI2VuZGlmIC8vIEhDRl9ETUEKSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CkhDRl9TVEFUSUMgdm9pZAkJCXB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKTsKSENGX1NUQVRJQyBpbnQJCQlzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCnN0YXRpYyBpbnQgZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApOwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCkhDRl9TVEFUSUMgaW50CQkJZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICk7CiNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkMKSENGX1NUQVRJQyBoY2ZfOAkJaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICk7CiNlbmRpZiAvLyBIQ0ZfRU5DQVAKSENGX1NUQVRJQyBoY2ZfOAkJbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07CiNpZiAhIGRlZmluZWQgSU5fUE9SVF9XT1JECQkJLy9yZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CmV4dGVybiBGSUxFICpsb2dfZmlsZTsKCiNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW5fcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSApCgpzdGF0aWMgaGNmXzE2IGluX3BvcnRfd29yZCggaGNmX2lvIHBvcnQgKSB7CmhjZl8xNiBpID0gKGhjZl8xNilfaW5wdyggcG9ydCApOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuUiAlMi4yeCAlNC40eCIsIChwb3J0KSYweEZGLCBpKTsKCX0KCXJldHVybiBpOwp9IC8vIGluX3BvcnRfd29yZAoKI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvdXRfcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKCnN0YXRpYyB2b2lkIG91dF9wb3J0X3dvcmQoIGhjZl9pbyBwb3J0LCBoY2ZfMTYgdmFsdWUgKSB7Cglfb3V0cHcoIHBvcnQsIHZhbHVlICk7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG5XICUyLjAyeCAlNC4wNHgiLCAocG9ydCkmMHhGRiwgdmFsdWUgKTsKCX0KfQoKdm9pZCBJTl9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIGRzdCwgaW50IG4pCXsKCWludCBpID0gMDsKCWhjZl8xNiBGQVIgKiBwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKCQkJCSAoaGNmXzE2KW4sIChoY2ZfMTYpbiwgKGhjZl8xNikocHJ0KSYweEZGLCBkc3QpOwoJfQoJd2hpbGUgKCBuLS0gKSB7CgkJcCA9IChoY2ZfMTYgRkFSICopZHN0OwoJCSpwKysgPSAoaGNmXzE2KV9pbnB3KCBwcnQgKTsKCQkqcCAgID0gKGhjZl8xNilfaW5wdyggcHJ0ICk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlcyUwOGx4ICIsIGkrKyAlIDB4MDggPyAiICIgOiAiXG4iLCAqZHN0KTsKCQl9CgkJZHN0Kys7Cgl9Cn0gLy8gSU5fUE9SVF9TVFJJTkdfMzIKCnZvaWQgSU5fUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogZHN0LCBpbnQgbikgewkvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKCWludCBpID0gMDsKCWlmICggbG9nX2ZpbGUgKSB7CgkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCgkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRiwgZHN0ICk7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQkqcCA9KGhjZl8xNilfaW5wdyggcHJ0KTsKCQlpZiAoIGxvZ19maWxlICkgewoJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CgkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOwoJCQl9IGVsc2UgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOwoJCQl9CgkJfQoJCXArKzsKCX0KfSAvLyBJTl9QT1JUX1NUUklOR184XzE2Cgp2b2lkIE9VVF9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIHNyYywgaW50IG4pCXsKCWludCBpID0gMDsKCWhjZl8xNiBGQVIgKiBwOwoJaWYgKCBsb2dfZmlsZSApIHsKCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxud3JpdGUgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCIsCgkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7Cgl9Cgl3aGlsZSAoIG4tLSApIHsKCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CgkJX291dHB3KCBwcnQsICpwKysgKTsKCQlfb3V0cHcoIHBydCwgKnAgICApOwoJCWlmICggbG9nX2ZpbGUgKSB7CgkJCWZwcmludGYoIGxvZ19maWxlLCAiJXMlMDhseCAiLCBpKysgJSAweDA4ID8gIiAiIDogIlxuIiwgKnNyYyk7CgkJfQoJCXNyYysrOwoJfQp9IC8vIE9VVF9QT1JUX1NUUklOR18zMgoKdm9pZCBPVVRfUE9SVF9TVFJJTkdfOF8xNiggaGNmX2lvIHBydCwgaGNmXzggRkFSICogc3JjLCBpbnQgbikJewkvL2Fsc28gaGFuZGxlcyBieXRlIGFsaWdubWVudCBwcm9ibGVtcwoJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsJCQkJCQkJCS8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCglpbnQgaSA9IDA7CglpZiAoIGxvZ19maWxlICkgewoJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTA0eCIsIG4sIG4sIChoY2ZfMTYpcHJ0KTsKCX0KCXdoaWxlICggbi0tICkgewoJCSh2b2lkKV9vdXRwdyggcHJ0LCAqcCk7CgkJaWYgKCBsb2dfZmlsZSApIHsKCQkJaWYgKCBpKysgJSAweDEwICkgewoJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKCQkJfSBlbHNlIHsKCQkJCWZwcmludGYoIGxvZ19maWxlLCAiXG4lMDR4ICIsICpwKTsKCQkJfQoJCX0KCQlwKys7Cgl9Cn0gLy8gT1VUX1BPUlRfU1RSSU5HXzhfMTYKCiNlbmRpZiAvLyBJTl9QT1JUX1dPUkQKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEIEEgVCBBICAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgSENGX0FTU0VSVApJRkJQIEJBU0VEIGFzc2VydF9pZmJwID0gTlVMTDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgojZW5kaWYgLy8gSENGX0FTU0VSVAoKI2lmIEhDRl9FTkNBUAovKiBTTkFQIGhlYWRlciB0byBiZSBpbnNlcnRlZCBpbiBFdGhlcm5ldC1JSSBmcmFtZXMgKi8KSENGX1NUQVRJQyAgaGNmXzggQkFTRUQgc25hcF9oZWFkZXJbXSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwJLy81IGJ5dGVzIHNpZ25hdHVyZSArCgkJCQkJCQkJCQkgIDAgfTsJCQkJCQkJLy8xIGJ5dGUgcHJvdG9jb2wgaWRlbnRpZmllcgojZW5kaWYgLy8gSENGX0VOQ0FQCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQpIQ0ZfU1RBVElDIGhjZl84IEJBU0VEIG1pY19wYWRbOF0gPSB7IDB4NUEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsJCS8vTUlDIHBhZGRpbmcgb2YgbWVzc2FnZQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECkNGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0gewoJc2l6ZW9mKGNmZ19kcnZfaWRlbnRpdHkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECglDRkdfRFJWX0lERU5USVRZLAkJCS8vICgweDA4MjYpCglNU0ZfQ09NUE9ORU5UX0lELAoJTVNGX0NPTVBPTkVOVF9WQVIsCglNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiwKCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCn0gOwoKQ0ZHX1JBTkdFU19TVFJDVCBCQVNFRCBjZmdfZHJ2X3N1cF9yYW5nZSA9IHsKCXNpemVvZihjZmdfZHJ2X3N1cF9yYW5nZSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfU1VQX1JBTkdFLAkJCS8vICgweDA4MjcpCgoJQ09NUF9ST0xFX1NVUEwsCglDT01QX0lEX0RVSSwKCXt7CURVSV9DT01QQVRfVkFSLAoJCURVSV9DT01QQVRfQk9ULAoJCURVSV9DT01QQVRfVE9QCgl9fQp9IDsKCnN0cnVjdCBDRkdfUkFOR0UzX1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19QUkksCQkvLyAoMHgwODI4KQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX1BSSSwKCXsKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1syXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQoJCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9Cgl9Cn0gOwoKCnN0cnVjdCBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19zdGEgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsCQkvLyAoMHgwODI5KQoKCUNPTVBfUk9MRV9BQ1QsCglDT01QX0lEX1NUQSwKCXsKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMQoJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzEKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMgoJIHsJMiwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzIKLy8gRm9yIE5hdGl2ZV9VU0IgKE5vdCB1c2VkISkKI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMwoJIHsJMywJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgoJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzMKLy8gV2FycAojaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl80Cgkgewk0LAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfU1RBX1ZBUl80Cgl9Cn0gOwoKCnN0cnVjdCBDRkdfUkFOR0U2X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kgPSB7CglzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksCQkvLyAoMHgwODJBKQoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfSFNJLAoJewojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8wCQkJCQkvLyBDb250cm9sbGVkIGRlcGxveW1lbnQKCSB7CTAsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzAKCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNwoJIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CgkgeyAwLCAwLCAwIH0sIAkJCQkJCQkvLyBIQ0ZfSFNJX1ZBUl8zIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNAkJCQkJLy8gSGVybWVzLUlJIGFsbCB0eXBlcwoJIHsJNCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0hTSV9WQVJfNAojaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl81CQkJCQkvLyBXQVJQIEhlcm1lcy0yLjUKCSB7CTUsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl81Cgl9Cn0gOwoKCkNGR19SQU5HRTRfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiA9IHsKCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAoJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiwJCS8vICgweDA4MkIpCgoJQ09NUF9ST0xFX0FDVCwKCUNPTVBfSURfQVBGLAoJewojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xCQkJCS8vKEZha2UpIEhlcm1lcy1JCgkgewkxLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzEKI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMgkJCQkvL0hlcm1lcy1JSQoJIHsJMiwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKCSB9LAojZWxzZQoJIHsgMCwgMCwgMCB9LAojZW5kaWYgLy8gSENGX0FQRl9WQVJfMgojaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8zCQkJCQkJLy8gTmF0aXZlX1VTQgoJIHsJMywJCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfSwKI2Vsc2UKCSB7IDAsIDAsIDAgfSwKI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzMKI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfNAkJCQkJCS8vIFdBUlAgSGVybWVzIDIuNQoJIHsJNCwJCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCgkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CgkgfQojZWxzZQoJIHsgMCwgMCwgMCB9CiNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl80Cgl9Cn0gOwojZGVmaW5lIEhDRl9WRVJTSU9OICBURVhUKCAiSENGJFJldmlzaW9uOiAxLjEwICQiICkKCnN0YXRpYyBzdHJ1Y3QgLypDRkdfSENGX09QVF9TVFJDVCovIHsKCWhjZl8xNglsZW47CQkJCQkvL2xlbmd0aCBvZiBjZmdfaGNmX29wdCBzdHJ1Y3QKCWhjZl8xNgl0eXA7CQkJCQkvL3R5cGUgMHgwODJDCgloY2ZfMTYJIHYwOwkJCQkJCS8vb2Zmc2V0IEhDRl9WRVJTSU9OCgloY2ZfMTYJIHYxOwkJCQkJCS8vIE1TRl9DT01QT05FTlRfSUQKCWhjZl8xNgkgdjI7CQkJCQkJLy8gSENGX0FMSUdOCgloY2ZfMTYJIHYzOwkJCQkJCS8vIEhDRl9BU1NFUlQKCWhjZl8xNgkgdjQ7CQkJCQkJLy8gSENGX0JJR19FTkRJQU4KCWhjZl8xNgkgdjU7CQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WICovCgloY2ZfMTYJIHY2OwkJCQkJCS8vIEhDRl9ETUEKCWhjZl8xNgkgdjc7CQkJCQkJLy8gSENGX0VOQ0FQCgloY2ZfMTYJIHY4OwkJCQkJCS8vIEhDRl9FWFQKCWhjZl8xNgkgdjk7CQkJCQkJLy8gSENGX0lOVF9PTgoJaGNmXzE2CXYxMDsJCQkJCQkvLyBIQ0ZfSU8KCWhjZl8xNgl2MTE7CQkJCQkJLy8gSENGX0xFR0FDWQoJaGNmXzE2CXYxMjsJCQkJCQkvLyBIQ0ZfTUFYX0xUVgoJaGNmXzE2CXYxMzsJCQkJCQkvLyBIQ0ZfUFJPVF9USU1FCgloY2ZfMTYJdjE0OwkJCQkJCS8vIEhDRl9TTEVFUAoJaGNmXzE2CXYxNTsJCQkJCQkvLyBIQ0ZfVEFMTElFUwoJaGNmXzE2CXYxNjsJCQkJCQkvLyBIQ0ZfVFlQRQoJaGNmXzE2CXYxNzsJCQkJCQkvLyBIQ0ZfTklDX1RBTF9DTlQKCWhjZl8xNgl2MTg7CQkJCQkJLy8gSENGX0hDRl9UQUxfQ05UCgloY2ZfMTYJdjE5OwkJCQkJCS8vIG9mZnNldCB0YWxsaWVzCglUQ0hBUgl2YWxbc2l6ZW9mKEhDRl9WRVJTSU9OKV07Cn0gQkFTRUQgY2ZnX2hjZl9vcHQgPSB7CglzaXplb2YoY2ZnX2hjZl9vcHQpL3NpemVvZihoY2ZfMTYpIC0xLAoJQ0ZHX0hDRl9PUFQsCQkJCS8vICgweDA4MkMpCgkoIHNpemVvZihjZmdfaGNmX29wdCkgLSBzaXplb2YoSENGX1ZFUlNJT04pIC0gNCApL3NpemVvZihoY2ZfMTYpLAojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECglNU0ZfQ09NUE9ORU5UX0lELAojZWxzZQoJMCwKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCUhDRl9BTElHTiwKCUhDRl9BU1NFUlQsCglIQ0ZfQklHX0VORElBTiwKCTAsCQkJCQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WKi8sCglIQ0ZfRE1BLAoJSENGX0VOQ0FQLAoJSENGX0VYVCwKCUhDRl9JTlRfT04sCglIQ0ZfSU8sCglIQ0ZfTEVHQUNZLAoJSENGX01BWF9MVFYsCglIQ0ZfUFJPVF9USU1FLAoJSENGX1NMRUVQLAoJSENGX1RBTExJRVMsCglIQ0ZfVFlQRSwKI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCglIQ0ZfTklDX1RBTF9DTlQsCglIQ0ZfSENGX1RBTF9DTlQsCglvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9UYWxseUxlbiApLAojZWxzZQoJMCwgMCwgMCwKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJSENGX1ZFUlNJT04KfTsgLy8gY2ZnX2hjZl9vcHQKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCiNpZiBkZWZpbmVkIEhDRl9UQUxMSUVTX0VYVFJBCglyZXBsYWNlZCBieSBIQ0ZfRVhUX1RBTExJRVNfRlcgOwojZW5kaWYgLy8gSENGX1RBTExJRVNfRVhUUkEKCiNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgpIQ0ZfU1RBVElDIExUVl9TVFJDVCBCQVNFRCBjZmdfbnVsbCA9IHsgMSwgQ0ZHX05VTEwsIHswfSB9OwojZW5kaWYgLy8gSENGX0VYVF9NQgpIQ0ZfU1RBVElDIGhjZl8xNiogQkFTRUQgeHh4eFsgXSA9IHsKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCSZjZmdfbnVsbC5sZW4sCQkJCQkJCS8vQ0ZHX05VTEwJCQkJCQkweDA4MjAKI2VuZGlmIC8vIEhDRl9FWFRfTUIKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAoJJmNmZ19kcnZfaWRlbnRpdHkubGVuLAkJCQkJLy9DRkdfRFJWX0lERU5USVRZICAgICAgICAgICAgICAweDA4MjYKCSZjZmdfZHJ2X3N1cF9yYW5nZS5sZW4sCQkJCQkvL0NGR19EUlZfU1VQX1JBTkdFICAgICAgICAgICAgIDB4MDgyNwoJJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmkubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSAgICAgICAgMHgwODI4CgkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkweDA4MjkKCSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19IU0kJCTB4MDgyQQoJJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYubGVuLAkJCS8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRgkJMHgwODJCCgkmY2ZnX2hjZl9vcHQubGVuLAkJCQkJCS8vQ0ZHX0hDRl9PUFQJCQkJCTB4MDgyQwoJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlcgkweEZEMDIKCU5VTEwsCQkJCQkJCQkJLy9JRkJfUFJJU3VwIHBsYWNlaG9sZGVyCQkweEZEMDMKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKCU5VTEwJCQkJCQkJCQkvL2VuZHNlbnRpbmVsCiAgfTsKI2RlZmluZSB4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQJKHNpemVvZih4eHh4KS9zaXplb2YoeHh4eFswXSkgLSAzKQoKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqKioqKioqKioqKioqKioqKioqKioqKioqKiBUIE8gUCAgIEwgRSBWIEUgTCAgIEggQyBGICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKKi5QVVJQT1NFCQlDaGFuZ2VzIHRoZSBydW4tdGltZSBDYXJkIGJlaGF2aW9yLgoqCQkJCVBlcmZvcm1zIE1pc2NlbGxhbnVvdXMgYWN0aW9ucy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCQkJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWFjdGlvbgkJCQkJbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIGNoYW5nZQoqCSAtIEhDRl9BQ1RfQ0NYX09GRgkJZGlzYWJsZSBDS0lQCioJIC0gSENGX0FDVF9DQ1hfT04JCWVuYWJsZSBDS0lQCioJIC0gSENGX0FDVF9JTlRfRk9SQ0VfT04JZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCioJIC0gSENGX0FDVF9JTlRfT0ZGCQlkaXNhYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCioJIC0gSENGX0FDVF9JTlRfT04JCWNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCQlIZXJtZXMgUHJvYmUgUmVzcG9ucyBTY2FuIChGMTAyKSBjb21tYW5kCioJIC0gSENGX0FDVF9SWF9BQ0sJCWFja25vd2xlZGdlIG5vbi1ETUEgcmVjZWl2ZXIgdG8gSGVybWVzCioJIC0gSENGX0FDVF9TQ0FOCQkJSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkgY29tbWFuZCAobm9uLVdBUlAgb25seSkKKgkgLSBIQ0ZfQUNUX1NMRUVQCQlERFMgU2xlZXAgcmVxdWVzdAoqCSAtIEhDRl9BQ1RfVEFMTElFUwkJSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkgY29tbWFuZAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCQkJCWFsbCAoaW5jbHVkaW5nIGludmFsaWQpCioJSENGX0lOVF9QRU5ESU5HCQkJSENGX0FDVF9JTlRfT0ZGLCBpbnRlcnJ1cHQgcGVuZGluZwoqCUhDRl9FUlJfTk9fTklDCQkJSENGX0FDVF9JTlRfT0ZGLCBOSUMgcHJlc2VuY2UgY2hlY2sgZmFpbHMKKgoqLkNPTkRJVElPTlMKKiBFeGNlcHQgZm9yIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiBvciBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyIG9yIGhjZl9jb25uZWN0IHdpdGggYW4gSS9PCiogYWRkcmVzcyAoaS5lLiBub3QgSENGX0RJU0NPTk5FQ1QpLCBhbGwgaGNmLWZ1bmN0aW9uIGNhbGxzIE1VU1QgYmUgcHJlY2VlZGVkIGJ5IGEgY2FsbCBvZiBoY2ZfYWN0aW9uIHdpdGgKKiBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyLgoqIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKiB3YXMgY2FsbGVkLgoqCiouREVTQ1JJUFRJT04KKiBoY2ZfYWN0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbW9kZSBjaGFuZ2luZyBhY3Rpb24tY29kZSBwYWlycyB0aGF0IGFyZSBhbnRvbnltcwoqCSAtIEhDRl9BQ1RfQ0NYX09GRiAvIEhDRl9BQ1RfQ0NYX09OCioJIC0gSENGX0FDVF9JTlRfW0ZPUkNFX11PTiAvIEhDRl9BQ1RfSU5UX09GRgoqCiogQWRkaXRpb25hbGx5IGhjZl9hY3Rpb24gY2FuIHN0YXJ0IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBpbiB0aGUgTklDOgoqCSAtIEhDRl9BQ1RfUFJTX1NDQU4KKgkgLSBIQ0ZfQUNUX1JYX0FDSwoqCSAtIEhDRl9BQ1RfU0NBTgoqCSAtIEhDRl9BQ1RfU0xFRVAKKgkgLSBIQ0ZfQUNUX1RBTExJRVMKKgoqIG8gSENGX0FDVF9JTlRfT0ZGOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRGlzYWJsZWQuCiogVGhpcyBjb21tYW5kLCBhbmQgdGhlIGFzc29jaWF0ZWQgW0ZvcmNlXSBFbmFibGUgTklDIGludGVycnVwdHMgY29tbWFuZCwgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBIQ0ZfSU5UX09OCiogY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBub3Qgc2V0IGF0IDB4MDAwMC4KKgoqIG8gSENGX0FDVF9JTlRfT046IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLgoqIEVuYWJsZSBOSUMgSW50ZXJydXB0cywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KKgoqIG8gSENGX0FDVF9JTlRfRk9SQ0VfT046IEZvcmNlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZCwgcmVnYXJkbGVzcyBvZmYgdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgoqCiogVGhlIGRpc2FibGluZyBhbmQgZW5hYmxpbmcgb2YgaW50ZXJydXB0cyBhcmUgYW50b255bXMuCiogVGhlc2UgYWN0aW9ucyBtdXN0IGJlIGJhbGFuY2VkLgoqIEZvciBlYWNoICJkaXNhYmxlIGludGVycnVwdHMiIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAiZW5hYmxlIGludGVycnVwdHMiLgoqIFRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGluIGEgcm93IHdpdGhvdXQgaW50ZXJ2ZW5pbmcgZW5hYmxlIGludGVycnVwdHMsIGluCiogb3RoZXIgd29yZHMsIHRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIG5lc3RlZC4KKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGF0IHRoZSBmaXJzdCBjYWxsIHdpdGggSENGX0FDVF9JTlRfT0ZGLgoqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgcmUtZW5hYmxlZCB3aGVuIHRoZSBudW1iZXIgb2YgY2FsbHMgd2l0aCBIQ0ZfQUNUX0lOVF9PTiBtYXRjaGVzIHRoZQoqIG51bWJlciBvZiBjYWxscyB3aXRoIElOVF9PRkYuCioKKiBJdCBpcyBub3QgYWxsb3dlZCB0byBoYXZlIG1vcmUgRW5hYmxlIE5JQyBJbnRlcnJ1cHRzIGNhbGxzIHRoYW4gRGlzYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscy4KKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGluaXRpYWxseSAoaS5lLiBhZnRlciBoY2ZfY29ubmVjdCkgZGlzYWJsZWQuCiogQW4gTVNGIGJhc2VkIG9uIGEgaW50ZXJydXB0IHN0cmF0ZWd5IG11c3QgY2FsbCBoY2ZfYWN0aW9uIHdpdGggSU5UX09OIGluIGl0cyBpbml0aWFsaXphdGlvbiBsb2dpYy4KKgoqIQlUaGUgSU5UX09GRi9JTlRfT04gaG91c2VrZWVwaW5nIGlzIGluaXRpYWxpemVkIGF0IDB4MDAwMCBieSBoY2ZfY29ubmVjdCwgY2F1c2luZyB0aGUgaW50ZXJydXB0IGdlbmVyYXRpb24KKgltZWNoYW5pc20gdG8gYmUgZGlzYWJsZWQgYXQgZmlyc3QuIFRoaXMgc3VpdHMgTVNGIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcG9sbGluZyBzdHJhdGVneS4KKgoqIG8gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKiEhIFRoaXMgY2FuIHVzZSBzb21lIG1vcmUgZXhwbGFuYXRpb247PwoqIERpc2FibGVzIGFuZCBFbmFibGVzIHN1cHBvcnQgaW4gdGhlIEhDRiBydW50aW1lIGNvZGUgZm9yIHRoZSBDQ1ggZmVhdHVyZS4gRWFjaCB0aW1lIG9uZSBvZiB0aGVzZSBhY3Rpb24KKiBjb2RlcyBpcyB1c2VkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIHVzZSBjZWFzZS4KKgoqIG8gSENGX0FDVF9TTEVFUDogSW5pdGlhdGVzIHRoZSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIHByb2Nlc3MKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIEhDRl9ERFMgY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBzZXQuIEl0IHRyaWdnZXJzIHRoZSBGL1cgdG8gc3RhcnQgdGhlCiogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCiogYSBDb25uZWN0ZWQgRGVlcFNsZWVwIChDRFMpLCB0aGUgSG9zdC1GL1cgc2xlZXAgaGFuZHNoYWtpbmcgaXMgY29tcGxldGVkIHdoZW4gdGhlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgaXMKKiBlbmFibGVkIChieSBtZWFucyBvZiB0aGUgYmFsYW5jaW5nIEhDRl9BQ1RfSU5UX09OKSwgaS5lLiBhdCB0aGF0IG1vbWVudCB0aGUgRi9XIHJlYWxseSBnb2VzIGludG8gc2xlZXAgbW9kZS4KKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCiogYWZ0ZXIgZ29pbmcgaW50byBzbGVlcC4KKgoqIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgoqCiogbyBIQ0ZfQUNUX1JYX0FDSzogUmVjZWl2ZXIgQWNrbm93bGVkZ2VtZW50IChub24tRE1BLCBub24tVVNCIG1vZGUgb25seSkKKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bwoqIHJlcG9ydCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuZXh0IFJ4IGZyYW1lLgoqIElmIHRoZSBNU0YgZG9lcyBub3QgbmVlZCBhY2Nlc3MgKGFueSBsb25nZXIpIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBlLmcuIGJlY2F1c2UgaXQgaXMgcmVqZWN0ZWQgYmFzZWQgb24gdGhlCiogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKKiBwb3RlbnRpYWwgb2YgaW1wcm92aW5nIHRoZSBwZXJmb3JtYW5jZS4KKiBJZiB0aGUgTVNGIGRvZXMgbm90IGV4cGxpdGx5IGFjayB0ZSByZWNlaXZlciwgdGhlIGFja2luZyBpcyBkb25lIGltcGxpY2l0bHkgaWY6CiogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQoqIC0gaWYgbm90IGluIHRoZSBhYm92ZSBzdGVwLCBieSBoY2ZfcmN2X21zZyAoYXNzdW1pbmcgaGNmX3Jjdl9tc2cgaXMgY2FsbGVkKQoqIC0gaWYgbmVpdGhlciBvZiB0aGUgYWJvdmUgaW1wbGljaXQgYWNrcyBub3IgYW4gZXhwbGljaXQgYWNrIGJ5IHRoZSBNU0YsIGJ5IHRoZSBmaXJzdCBoY2Zfc2VydmljZV9uaWMgYWZ0ZXIKKgl0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgoqIE5vdGU6IElmIGFuIFJ4IGZyYW1lIGlzIGFscmVhZHkgYWNrZWQsIGFuIGV4cGxpY2l0IEFDSyBieSB0aGUgTVNGIGFjdHMgYXMgYSBOb09wZXJhdGlvbi4KKgoqIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKiBUaGUgSW5xdWlyZSBUYWxsaWVzIGNvbW1hbmQgcmVxdWVzdHMgdGhlIEYvVyB0byBwcm92aWRlIGl0cyBjdXJyZW50IHNldCBvZiB0YWxsaWVzLgoqIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KKgoqIG8gSENGX0FDVF9QUlNfU0NBTjogSW5xdWlyZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZAoqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKiBUaGUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQgc3RhcnRzIGEgc2NhbiBzZXF1ZW5jZS4KKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCioKKiBvIEhDRl9BQ1RfU0NBTjogSW5xdWlyZSBTY2FuIGNvbW1hbmQKKiBUaGlzIGNvbW1hbmQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIEhJSSBGL1cgKGkuZS4gcHJlLVdBUlApIGFuZCBpdCBpcyBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCiogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCiogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCiogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCiogLSBIQ0ZfQUNUX0lOVF9PTiBjb21tYW5kcyBvdXRudW1iZXIgdGhlIEhDRl9BQ1RfSU5UX09GRiBjb21tYW5kcy4KKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvcgoqCW11bHRpLXRocmVhZGluZwoqCiogLSBTaW5jZSB0aGUgSENGIGRvZXMgbm90IG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgRi9XIGVuYWJsZWQgc3RhdGUsIGl0IGlzIG5vdCBhc3NlcnRlZAoqCXdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgoqCiouRElBR1JBTQoqIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYwoqCWF0IHRhc2stbGV2ZWwgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgc2hpZWxkaW5nIHdpdGggSENGX0FDVF9PTi9fT0ZGLiBIb3dldmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYKKglhY3Rpb24gaXRzZWxmIGNhbiBwZXIgZGVmaW5pdGlvbiBub3QgYmUgcHJvdGVjdGVkIHRoaXMgd2F5LiBCYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24sIGl0IGNhbiBiZSBjb25jbHVkZWQsCioJdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCioJZXhwbGljaXRseSBjaGVjayBmb3IgdGhpcyBjb25kaXRpb24gKGFsdGhvdWdoIHRoZXJlIHdhcyBhIHJlcG9ydCBvZiBhbiBNU0Ygd2hpY2ggcmFuIGludG8gdGhpcyBhc3NlcnQuCiogMjpJRkJfSW50T2ZmQ250IGlzIHVzZWQgdG8gYmFsYW5jZSB0aGUgSU5UX09GRiBhbmQgSU5UX09OIGNhbGxzLiAgRGlzYWJsaW5nIG9mIHRoZSBpbnRlcnJ1cHRzIGlzIGFjaGlldmVkIGJ5CioJd3JpdGluZyBhIHplcm8gdG8gdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4gIEluIGEgc2hhcmVkIGludGVycnVwdCBlbnZpcm9ubWVudCAoZS5nLiB0aGUgbWluaS1QQ0kgTkRJUwoqCWRyaXZlcikgaXQgaXMgY29uc2lkZXJlZCBtb3JlIGNvcnJlY3QgdG8gcmV0dXJuIHRoZSBzdGF0dXMgSENGX0lOVF9QRU5ESU5HIGlmIGFuZCBvbmx5IGlmLCB0aGUgY3VycmVudAoqCWludm9jYXRpb24gb2YgaGNmX3NlcnZpY2VfbmljIGlzIChhcHBhcmVudGx5KSBjYWxsZWQgaW4gdGhlIElTUiB3aGVuIHRoZSBJU1Igd2FzIGFjdGl2YXRlZCBhcyByZXN1bHQgb2YgYQoqCWNoYW5nZSBpbiBIUkVHX0VWX1NUQVQgbWF0Y2hpbmcgYSBiaXQgaW4gSFJFR19JTlRfRU4sIGkuZS4gbm90IGlmIGludm9rZWQgYXMgcmVzdWx0IG9mIGFub3RoZXIgZGV2aWNlCioJZ2VuZXJhdGluZyBhbiBpbnRlcnJ1cHQgb24gdGhlIHNoYXJlZCBpbnRlcnJ1cHQgbGluZS4KKglOb3RlIDE6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBhZHZlcnNlIGNvbmRpdGlvbnMgb24gY2VydGFpbiBwbGF0Zm9ybXMgdGhlIHdyaXRpbmcgb2YKKglIUkVHX0lOVF9FTiBjYW4gYXBwYXJlbnRseSBmYWlsLCB0aGVyZWZvciBpdCBpcyBwYXJhbW91bnQgdGhhdCBIUkVHX0lOVF9FTiBpcyB3cml0dGVuIGFnYWluIHdpdGggMCBmb3IKKgllYWNoIGFuZCBldmVyeSBjYWxsIHRvIEhDRl9BQ1RfSU5UX09GRi4KKglOb3RlIDI6IGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgdW5kZXIgY2VydGFpbiBIL1cgJiBTL1cgYXJjaGl0ZWN0dXJlcyB0aGlzIGxvZ2ljIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzCioJbm8gTklDIGF0IGFsbC4gVG8gY2F0ZXIgZm9yIHRoaXMsIHRoZSB2YWx1ZSBvZiBIUkVHX0lOVF9FTiBpcyB2YWxpZGF0ZWQuIElmIHRoZSB1bnVzZWQgYml0IDB4MDEwMCBpcyBzZXQsCioJaXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBubyBOSUMuCioJTm90ZSAzOiBEdXJpbmcgdGhlIGRvd25sb2FkIHByb2Nlc3MsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEYvVyByZXNldCBIUkVHX1NXXzAsIGhlbmNlIGNoZWNraW5nIHRoaXMKKglyZWdpc3RlciBmb3IgSENGX01BR0lDICh0aGUgY2xhc3NpY2FsIE5JQyBwcmVzZW5jZSB0ZXN0KSB3aGVuIEhDRl9BQ1RfSU5UX09GRiBpcyBjYWxsZWQgZHVlIHRvIGFub3RoZXIKKgljYXJkIGludGVycnVwdGluZyB2aWEgYSBzaGFyZWQgSVJRIGR1cmluZyBhIGRvd25sb2FkLCBmYWlscy4KKjQ6CVRoZSBjb25zdHJ1Y3Rpb24gImlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgKSIgaXMgb3B0aW1hbCAoaW4gdGhlIHNlbnNlIG9mIHNob3J0ZXN0L3F1aWNrZXN0CioJcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KKglFbmFibGluZyBvZiB0aGUgaW50ZXJydXB0cyBpcyBhY2hpZXZlZCBieSB3cml0aW5nIHRoZSBIZXJtZXMgSW50RW4gcmVnaXN0ZXIuCioJIC0gSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUsIHRoZSBpbnRlcnJ1cHRzIHN0YXkgZGlzYWJsZWQuCioJIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KKgkgLSBXaGVuIHRoZSBIQ0YgaXMgb3V0IG9mIFR4L05vdGlmeSByZXNvdXJjZXMsIHRoZSBIQ0YgaXMgYWxzbyBpbnRlcmVzdGVkIGluIEFsbG9jIEV2ZW50cy4KKgkgLSB2aWEgSENGX0VYVCwgdGhlIE1TRiBwcm9ncmFtbWVyIGNhbiBhbHNvIHJlcXVlc3QgSFJFR19FVl9USUNLIGFuZC9vciBIUkVHX0VWX1RYX0VYQyBpbnRlcnJ1cHRzLgoqCUZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCioJZXZlbnQgYXMgc29vbiBhcyBpdCBoYXMgcHVtcGVkIGEgZnJhbWUgZnJvbSBob3N0IHJhbSBpbnRvIE5JQy1SQU0gKG5vdGUgdGhhdCB0aGUgZnJhbWUgZG9lcyBub3QgaGF2ZSB0byBiZQoqCXRyYW5zbWl0dGVkIHRoZW4pLCBhbmQgYSAnUnhEbWFEb25lJyBldmVudCBhcyBzb29uIGFzIGEgcmVjZWl2ZWQgZnJhbWUgaGFzIGJlZW4gcHVtcGVkIGZyb20gTklDLVJBTSBpbnRvCioJaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKKglyZWFjdCB0byBhbmQgYWNrbm93bGVkZ2UgdGhpcyBldmVudC4KKjY6CWFjayB0aGUgIm9sZCIgUngtZXZlbnQuIFNlZSAiUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kiIGluIGhjZl9zZXJ2aWNlX25pYyBhYm92ZSBmb3IgbW9yZSBleHBsYW5hdGlvbi4KKglJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgoqCXN1cHBsaWVkIHRvIHRoZSBNU0YgaW4gdGhlIHN0YXRlICJubyBmcmFtZSByZWNlaXZlZCIuCio4OglUaGUgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIGFuZCBIQ0ZfQUNUX1RBTExJRVMgYWN0aXZpdHkgYXJlIG1lcmdlZCBieSAiY2xldmVyIiBhbGdlYnJhaWMKKgltYW5pcHVsYXRpb25zIG9mIHRoZSBSSUQtdmFsdWVzIGFuZCBhY3Rpb24gY29kZXMsIHNvIGZvcmVnb2luZyByb2J1c3RuZXNzIGFnYWluc3QgbWlncmF0aW9uIHByb2JsZW1zIGZvcgoqCWVhc2Ugb2YgaW1wbGVtZW50YXRpb24uIFRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQKKglIQ0ZfQUNUX1RBTExJRVMgZXRjIGFyZSBjaGVja2VkIGJ5IHRoZSAiI2lmIiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhlIGJvZHkgb2YgdGhpcyByb3V0aW5lLCByZXN1bHRpbmcKKglpbjogZXJyICJtYWludGVuYW5jZSIgZHVyaW5nIGNvbXBpbGF0aW9uIGlmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm8gbG9uZ2VyIG1ldC4gVGhlIHdyaXRpbmcgb2YgSFJFR19QQVJBTV8xCioJd2l0aCAweDNGRkYgaW4gY2FzZSBvZiBhbiBQUlMgc2NhbiwgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCBsYWNrIG9mIHNwZWNpZmljYXRpb24sIGhlbmNlIGRpZmZlcmVudAoqCWltcGxlbWVudGF0aW9uIGluIEYvVyBhbmQgSG9zdC4KKglXaGVuIHRoZXJlIGlzIG5vIE5JQyBSQU0gYXZhaWxhYmxlLCBzb21lIHZlcnNpb25zIG9mIHRoZSBIZXJtZXMgRi9XIGRvIHJlcG9ydCAweDdGMDAgYXMgZXJyb3IgaW4gdGhlCioJUmVzdWx0IGZpZWxkIG9mIHRoZSBTdGF0dXMgcmVnaXN0ZXIgYW5kIHNvbWUgRi9XIHZlcnNpb25zIGRvbid0LiBUbyBtYXNrIHRoaXMgZGlmZmVyZW5jZSB0byB0aGUgTVNGIGFsbAoqCXJldHVybiBjb2RlcyBvZiB0aGUgSGVybWVzIGFyZSBpZ25vcmVkICgiYmVzdCIgYW5kICJtb3N0IHNpbXBsZSIgc29sdXRpb24gdG8gdGhlc2UgdHlwZXMgb2YgYW5hbG9taWVzIHdpdGgKKglhbiBhY2NlcHRhYmxlIGxvc3MgZHVlIHRvIGlnbm9yaW5nIGFsbCBlcnJvciBzaXR1YXRpb25zIGFzIHdlbGwpLgoqCVRoZSAiTm8gaW5xdWlyZSBzcGFjZSIgaXMgcmVwb3J0ZWQgdmlhIHRoZSBIZXJtZXMgdGFsbGllcy4KKjMwOiBkbyBub3QgSENGQVNTRVJUKCByYywgcmMgKSBzaW5jZSByYyA9PSBIQ0ZfSU5UX1BFTkRJTkcgaXMgbm8gZXJyb3IKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCiNpZiBDRkdfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgojZW5kaWYgLy8gSENGX1RZUEVfSElJNQojaWYgQ0ZHX1BSU19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9QUlNfU0NBTgplcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCiNlbmRpZgppbnQKaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKewppbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCiNpZiBIQ0ZfSU5UX09OCglIQ0ZMT0dFTlRSWSggYWN0aW9uID09IEhDRl9BQ1RfSU5UX0ZPUkNFX09OID8gSENGX1RSQUNFX0FDVElPTl9LTFVER0UgOiBIQ0ZfVFJBQ0VfQUNUSU9OLCBhY3Rpb24gKQkJCQkJCQkJCQkJCQkJLyogMCAqLwojaWYgKEhDRl9TTEVFUCkKCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiwKCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQojZWxzZQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgYWN0aW9uICkKI2VuZGlmIC8vIEhDRl9TTEVFUAoJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiB8fAoJCQkgICBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiwgIGFjdGlvbiApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPD0gMTYgfHwgaWZicC0+SUZCX0ludE9mZkNudCA+PSAweEZGRkUsCgkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkJLy9uZXN0aW5nIG1vcmUgdGhhbiAxNiBkZWVwIHNlZW1zIHVucmVhc29uYWJsZQojZW5kaWYgLy8gSENGX0lOVF9PTgoKCXN3aXRjaCAoYWN0aW9uKSB7CiNpZiBIQ0ZfSU5UX09OCmhjZl8xNglpOwoJICBjYXNlIEhDRl9BQ1RfSU5UX09GRjoJCQkJCQkvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCiNpZiBIQ0ZfU0xFRVAKCQlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFICkgewkvLyBXYWtlVXAgdGVzdAk7P3RpZSB0aGlzIHRvIHRoZSAibmV3IiBzdXBlci1MaW5rU3RhdAoJCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCgkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQKCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7CQkvLyBzZXQgd2FrZXVwIGJpdCB0byBjb3VudGVyYWN0IHRoZSBjbGVhcmluZyBieSBGL1cKCQkJLy8gODAwIHVzIGxhdGVuY3kgYmVmb3JlIEZXIHN3aXRjaGVzIHRvIGhpZ2ggcG93ZXIKCQkJTVNGX1dBSVQoODAwKTsJCQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCi8vT09SCQlpZiAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9EU19PT1IgKSB7IC8vIE91dE9mUmFuZ2UKLy8JCQkJcHJpbnRrKCAiPDU+QUNUX0lOVF9PRkY6IERlZXBzbGVlcCBwaGFzZSB0ZXJtaW5hdGVkLCBlbmFibGUgYW5kIGdvIHRvIEF3YWl0Q29ubmVjdGlvblxuIiApOwkJLy87P3JlbW92ZSBtZSAxIGRheQovLwkJCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRU5BQkxFICk7Ci8vCQkJfQovLwkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ICY9IH4oIENGR19MSU5LX1NUQVRfRFNfSVIgfCBDRkdfTElOS19TVEFUX0RTX09PUik7CS8vY2xlYXIgSVIvT09SIHN0YXRlCgkJfQojZW5kaWYgLy8gSENGX1NMRUVQCi8qMiovCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsKLy8hICAgICByYyA9IDA7CgkJaSA9IElQVyggSFJFR19JTlRfRU4gKTsKCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7CgkJaWYgKCBpICYgMHgxMDAwICkgewoJCQlyYyA9IEhDRl9FUlJfTk9fTklDOwoJCX0gZWxzZSB7CgkJCWlmICggaSAmIElQVyggSFJFR19FVl9TVEFUICkgKSB7CgkJCQlyYyA9IEhDRl9JTlRfUEVORElORzsKCQkJfQoJCX0KCQlicmVhazsKCgkgIGNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046CQkJCS8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCgkJaWZicC0+SUZCX0ludE9mZkNudCA9IDA7CgkJLy9GYWxsIHRocm91Z2ggaW4gSENGX0FDVF9JTlRfT04KCgkgIGNhc2UgSENGX0FDVF9JTlRfT046CQkJCQkJLy8gRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCi8qNCovCWlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgJiYgaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CgkJCQkJCQkJCQkJCS8vZGV0ZXJtaW5lIEludGVycnVwdCBFdmVudCBtYXNrCiNpZiBIQ0ZfRE1BCgkJCWlmICggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgewoJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEIHwgSFJFR19FVl9UWF9FWFQ7CS8vbWFzayB3aGVuIERNQSBhY3RpdmUKCQkJfSBlbHNlCiNlbmRpZiAvLyBIQ0ZfRE1BCgkJCXsKCQkJCWkgPSBIUkVHX0VWX0lORk8gfCBIUkVHX0VWX1JYIHwgSFJFR19FVl9UWF9FWFQ7CQkJCQkJLy9tYXNrIHdoZW4gRE1BIG5vdCBhY3RpdmUKCQkJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgewoJCQkJCWkgfD0gSFJFR19FVl9BTExPQzsJCQkJCQkJCQkJCQkvL21hc2sgd2hlbiBubyBUeEZJRCBhdmFpbGFibGUKCQkJCX0KCQkJfQojaWYgSENGX1NMRUVQCgkJCWlmICggKCBJUFcoSFJFR19FVl9TVEFUKSAmICggaSB8IEhSRUdfRVZfU0xFRVBfUkVRICkgKSA9PSBIUkVHX0VWX1NMRUVQX1JFUSApIHsKCQkJCS8vIGZpcm13YXJlIGluZGljYXRlcyBpdCB3b3VsZCBsaWtlIHRvIGdvIGludG8gc2xlZXAgbW9kdXMKCQkJCS8vIG9ubHkgYWNrbm93bGVkZ2UgdGhpcyByZXF1ZXN0IGlmIG5vIG90aGVyIGV2ZW50cyB0aGF0IGNhbiBjYXVzZSBhbiBpbnRlcnJ1cHQgYXJlIHBlbmRpbmcKCQkJCWlmYnAtPklGQl9JbnRPZmZDbnQtLTsJCQkvL2JlY29tZXMgMHhGRkZFCiAgICAgICAgICAgIAlPUFcoIEhSRUdfSU5UX0VOLCBpIHwgSFJFR19FVl9USUNLICk7CgkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfVElDSyB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOwoJCQl9IGVsc2UKI2VuZGlmIC8vIEhDRl9TTEVFUAoJCQl7CiAgICAgICAgICAgIAlPUFcoIEhSRUdfSU5UX0VOLCBpIHwgSFJFR19FVl9TTEVFUF9SRVEgKTsKCQkJfQoJCX0KCQlicmVhazsKI2VuZGlmIC8vIEhDRl9JTlRfT04KCiNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCSAgY2FzZSBIQ0ZfQUNUX1NMRUVQOgkJCQkJCS8vIEREUyBTbGVlcCByZXF1ZXN0CgkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0RJU0FCTEUgKTsKCQljbWRfZXhlKCBpZmJwLCBIQ01EX1NMRUVQLCAwICk7CgkJYnJlYWs7Ci8vIAkgIGNhc2UgSENGX0FDVF9XQUtFVVA6CQkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0Ci8vIAkJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSwgaWZicC0+SUZCX0ludE9mZkNudCApCi8vIAkJaWZicC0+SUZCX0ludE9mZkNudCsrOwkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCi8vIAkJT1BXKCBIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwovLyAJCU1TRl9XQUlUKDgwMCk7CQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCi8vIAkJcmMgPSBoY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX0lOVF9PRkYgKTsJLypib2d1cywgSUZCX0ludE9mZkNudCA9PSAweEZGRkYsIHNvIGlmIHlvdSBjYXJlZnVsbHkgbG9vawovLyAJCQkJCQkJCQkJCQkJICphdCB0aGUgI2lmIEhDRl9ERFMgc3RhdGVtZW50cywgSENGX0FDVF9JTlRfT0ZGIGlzIGVtcHR5Ci8vIAkJCQkJCQkJCQkJCQkgKmZvciBERFMuICJNdWNoIiBiZXR0ZXIgd291bGQgYmUgdG8gbWVyZ2UgdGhlIGZsb3dzIGZvcgovLyAJCQkJCQkJCQkJCQkJICpERFMgYW5kIERFRVBfU0xFRVAKLy8gCQkJCQkJCQkJCQkJCSAqLwovLyAJCWJyZWFrOwojZW5kaWYgLy8gSENGX0REUwoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PTjoJCQkJCQkvLyBlbmFibGUgQ0tJUAoJICBjYXNlIEhDRl9BQ1RfQ0NYX09GRjoJCQkJCQkvLyBkaXNhYmxlIENLSVAKCQlpZmJwLT5JRkJfQ0tJUFN0YXQgPSBhY3Rpb247CgkJYnJlYWs7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCgkgIGNhc2UgSENGX0FDVF9SWF9BQ0s6CQkJCQkJLy9SZWNlaXZlciBBQ0sKLyo2Ki8JaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CgkJCURBV0FfQUNLKCBIUkVHX0VWX1JYICk7CgkJfQoJCWlmYnAtPklGQl9SeEZJRCA9IGlmYnAtPklGQl9SeExlbiA9IDA7CgkJYnJlYWs7CgovKjgqLyBjYXNlCUhDRl9BQ1RfUFJTX1NDQU46CQkJCQkvLyBIZXJtZXMgUFJTIFNjYW4gKEYxMDIpCgkJT1BXKCBIUkVHX1BBUkFNXzEsIDB4M0ZGRiApOwoJCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX1RBTExJRVMKCSAgY2FzZSBIQ0ZfQUNUX1RBTExJRVM6CQkJCQkJLy8gSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkKI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCgkgIGNhc2UgSENGX0FDVF9TQ0FOOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFNjYW4gKEYxMDEpCiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CgkJLyohISB0aGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kIEhDRl9BQ1RfVEFMTElFUyBldGMKCQkgKiAgIGFyZSBjaGVja2VkIGJ5ICNpZiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhpcyByb3V0aW5lIHJlc3VsdGluZyBpbjogZXJyICJtYWludGVuYW5jZSIJKi8KCQljbWRfZXhlKCBpZmJwLCBIQ01EX0lOUVVJUkUsIGFjdGlvbiAtIEhDRl9BQ1RfVEFMTElFUyArIENGR19UQUxMSUVTICk7CgkJYnJlYWs7CgoJICBkZWZhdWx0OgoJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBhY3Rpb24gKQoJCWJyZWFrOwoJfQoJLy8hIGRvIG5vdCBIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCQkJCQkJCQkJCQkJCQkvKiAzMCovCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQUNUSU9OICkKCXJldHVybiByYzsKfSAvLyBoY2ZfYWN0aW9uCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJaW50IGhjZl9jbnRsKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKQoqLlBVUlBPU0UJCUNvbm5lY3Qgb3IgZGlzY29ubmVjdCBhIHNwZWNpZmljIHBvcnQgdG8gYSBzcGVjaWZpYyBuZXR3b3JrLgoqISEgIDs/Pz8/Pz8/Pz8/Pz8/Pz8/IGNvbnRpbnVlIG5lZWRzIG1vcmUgZXhwbGFuYXRpb24KKgkJCQlyZWNvdmVycyBieSBtZWFucyBvZiAiY29udGludWUiIHdoZW4gdGhlIGNvbm5lY3QgcHJvY2VzIGluIENDWCBtb2RlIGZhaWxzCioJCQkJRW5hYmxlcyBvciBkaXNhYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGZvciB0aGUgTklDLgoqCQkJCUFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgoqCQkJCUFjdGl2YXRlcyBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzIGF0IGVuYWJsZS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWNtZAkJCTB4MDAxRjoJSGVybWVzIGNvbW1hbmQgKGRpc2FibGUsIGVuYWJsZSwgY29ubmVjdCwgZGlzY29ubmVjdCwgY29udGludWUpCioJCQkJCUhDRl9DTlRMX0VOQUJMRQkJRW5hYmxlCioJCQkJCUhDRl9DTlRMX0RJU0FCTEUgICAgRGlzYWJsZQoqCQkJCQlIQ0ZfQ05UTF9DT05USU5VRQlDb250aW51ZQoqCQkJCQlIQ0ZfQ05UTF9DT05ORUNUICAgIENvbm5lY3QKKgkJCQkJSENGX0NOVExfRElTQ09OTkVDVCBEaXNjb25uZWN0CioJCQkJMHgwMTAwOiBjb21tYW5kIHF1YWxpZmllciAoY29udGludWUpCioJCQkJCUhDTURfUkVUUlkJCQlyZXRyeSBmbGFnCioJCQkJMHgwNzAwOiAgcG9ydCBudW1iZXIgKGNvbm5lY3QvZGlzY29ubmVjdCkKKgkJCQkJSENGX1BPUlRfMCAgICAgICAgICBNQUMgUG9ydCAwCioJCQkJCUhDRl9QT1JUXzEgICAgICAgICAgTUFDIFBvcnQgMQoqCQkJCQlIQ0ZfUE9SVF8yICAgICAgICAgIE1BQyBQb3J0IDIKKgkJCQkJSENGX1BPUlRfMyAgICAgICAgICBNQUMgUG9ydCAzCioJCQkJCUhDRl9QT1JUXzQgICAgICAgICAgTUFDIFBvcnQgNAoqCQkJCQlIQ0ZfUE9SVF81ICAgICAgICAgIE1BQyBQb3J0IDUKKgkJCQkJSENGX1BPUlRfNiAgICAgICAgICBNQUMgUG9ydCA2CioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKiEhCXZpYSBjbWRfZXhlCioJSENGX0VSUl9OT19OSUMKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCioJSENGX0VSUl9USU1FX09VVAoqCiouREVTQ1JJUFRJT04KKiBUaGUgcGFyYW1ldGVyIGNtZCBjb250YWlucyBhIG51bWJlciBvZiBzdWJmaWVsZHMuCiogVGhlIGFjdHVhbCB2YWx1ZSBmb3IgY21kIGlzIGNyZWF0ZWQgYnkgbG9naWNhbCBvci1pbmcgdGhlIGFwcHJvcHJpYXRlIG1uZW1vbmljcyBmb3IgdGhlIHN1YmZpZWxkcy4KKiBUaGUgZmllbGQgMHgwMDFGIGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvZGUKKiAgLSBIQ0ZfQ05UTF9FTkFCTEUKKiAgLSBIQ0ZfQ05UTF9ESVNBQkxFCiogIC0gSENGX0NOVExfQ09OTkVDVAoqICAtIEhDRl9DTlRMX0RJU0NPTk5FQ1QKKiAgLSBIQ0ZfQ05UTF9DT05USU5VRQoqCiogRm9yIEhDRl9DTlRMX0NPTlRJTlVFLCB0aGUgZmllbGQgMHgwMTAwIGNvbnRhaW5zIHRoZSByZXRyeSBmbGFnIEhDTURfUkVUUlkuCiogRm9yIEhDRl9DTlRMX0NPTk5FQ1QgYW5kIEhDRl9DTlRMX0RJU0NPTk5FQ1QsIHRoZSBmaWVsZCAweDA3MDAgY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyIGFzIEhDRl9QT1JUXyMuCiogRm9yIFN0YXRpb24gYXMgd2VsbCBhcyBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDAgaXMgdGhlICJub3JtYWwiIGNvbW11bmljYXRpb24gY2hhbm5lbC4KKiBGb3IgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAxIHRocm91Z2ggNiBjb250cm9sIHRoZSBXRFMgbGlua3MuCioKKiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgbmFtZXMgSENGX0NOVExfRElTQUJMRSBhbmQgSENGX0NOVExfRU5BQkxFLCBoY2ZfY250bCBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIE5JQwoqIEludGVycnVwdHMgbW9kZS4KKgoqIFRoZSBDb25uZWN0IGlzIHVzZWQgYnkgdGhlIE1TRiB0byBicmluZyBhIHBhcnRpY3VsYXIgcG9ydCBpbiBhbiBpbmFjdGl2ZSBzdGF0ZSBhcyBmYXIgYXMgZGF0YSB0cmFuc21pc3Npb24KKiBhbmQgcmVjZXB0aW9uIGFyZSBjb25jZXJuZWQuCiogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBkaXNjb25uZWN0ZWQ6CiogLSB0aGUgRi9XIGRpc2FibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgoqIC0gdGhlIEYvVyBpZ25vcmVzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKiAtIGFsbCBmcmFtZXMgKFJlY2VpdmUgYXMgd2VsbCBhcyBwZW5kaW5nIFRyYW5zbWl0KSBmb3IgdGhhdCBwb3J0IG9uIHRoZSBOSUMgYXJlIGRpc2NhcmRlZC4KKgoqIFdoZW4gdGhlIE5JQyBpcyBkaXNhYmxlZCwgYWJvdmUgbGlzdCBhcHBsaWVzIHRvIGFsbCBwb3J0cywgaS5lLiB0aGUgcmVzdWx0IGlzIGxpa2UgYWxsIHBvcnRzIGFyZQoqIGRpc2Nvbm5lY3RlZC4KKgoqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgY29ubmVjdGVkOgoqIC0gdGhlIEYvVyBlZmZlY3R1YXRlcyB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcG9ydC4KKiAtIGVuYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCiogLSBhY2NlcHRzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKgoqIEVuYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CiogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzLgoqCVRoZSBGL1cgb25seSB1cGRhdGVzIGl0cyBzdGF0aWMgY29uZmlndXJhdGlvbiBhdCBhIHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkIG9yIGZyb20KKglkaXNjb25uZWN0ZWQgdG8gY29ubmVjdGVkLgoqCUluIG9yZGVyIHRvIGVuZm9yY2UgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uLCB0aGUgTVNGIG11c3QgYXNzdXJlIHRoYXQgc3VjaCBhIHRyYW5zaXRpb24gdGFrZXMgcGxhY2UuCioJRHVlIHRvIHN1Y2ggYSBkaXNhYmxlL2VuYWJsZSBvciBkaXNjb25uZWN0L2Nvbm5lY3Qgc2VxdWVuY2UsIFJ4L1R4IGZyYW1lcyBtYXkgYmUgbG9zdCwgaW4gb3RoZXIgd29yZHMsCioJY29uZmlndXJhdGlvbiBtYXkgaW1wYWN0IGNvbW11bmljYXRpb24uCiogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KKiBOb3RlIHRoYXQgdGhlIEVuYWJsZSBGdW5jdGlvbiBieSBpdHNlbGYgb25seSBlbmFibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24sIGl0CiogZG9lcyBub3QgZW5hYmxlIHRoZSBJbnRlcnJ1cHQgR2VuZXJhdGlvbiBtZWNoYW5pc20uIFRoaXMgaXMgZG9uZSBieSBoY2ZfYWN0aW9uLgoqCiogRGlzYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CiohISAgOz8/Pz8/aXMgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgcmVhbGx5IHRydWUKKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBkaXNhYmxlZC4KKgoqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KKgoqIEFsdGhvdWdoIHRoZSBFbmFibGUvRGlzYWJsZSBhbmQgQ29ubmVjdC9EaXNjb25uZWN0IGFyZSBhbnRvbnltcywgdGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlaXIgc2VxdWVuY2luZywKKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KKiBFYWNoIHRpbWUgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgY2FsbHMgY2Vhc2UuCioKKiBBc3NlcnQgZmFpbHMgaWYKKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQuCiogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCiogLSBBbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4gb3IgYSBiaXQgb3V0c2lkZSB0aGUgc3ViZmllbGRzIGlzIGdpdmVuLgoqIC0gYW55IHJldHVybiBjb2RlIGJlc2lkZXMgSENGX1NVQ0NFU1MuCiogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCioJbXVsdGktdGhyZWFkaW5nCioKKi5ESUFHUkFNCioJaGNmX2NudGwgdGFrZXMgc3VjY2Vzc2l2ZWx5IHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKjI6CUlmIHRoZSBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlIG9yIGluY29tcGF0aWJsZSB3aXRoIHRoZSBQcmltYXJ5IG9yIFN0YXRpb24gU3VwcGxpZXIgaW4gdGhlIEhlcm1lcywKKgloY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KKjg6CXdoZW4gdGhlIHBvcnQgaXMgZGlzYWJsZWQsIHRoZSBETUEgZW5naW5lIG5lZWRzIHRvIGJlIGRlLWFjdGl2YXRlZCwgc28gdGhlIGhvc3QgY2FuIHNhZmVseSByZWNsYWltIHR4CioJcGFja2V0cyBmcm9tIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluLgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCnsKaW50CXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CiNpZiBIQ0ZfQVNTRVJUCnsJaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOwoJaWYgKCB4ID09IEhDRl9DTlRMX0NPTlRJTlVFICkgeCAmPSB+SENNRF9SRVRSWTsKCWVsc2UgaWYgKCAoeCA9PSBIQ01EX0RJU0FCTEUgfHwgeCA9PSBIQ01EX0VOQUJMRSkgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQICkgewoJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7Cgl9CglIQ0ZBU1NFUlQoIHg9PUhDRl9DTlRMX0VOQUJMRSAgfHwgeD09SENGX0NOVExfRElTQUJMRSAgICB8fCBIQ0ZfQ05UTF9DT05USU5VRSB8fAoJCQkgICB4PT1IQ0ZfQ05UTF9DT05ORUNUIHx8IHg9PUhDRl9DTlRMX0RJU0NPTk5FQ1QsIGNtZCApCn0KI2VuZGlmIC8vIEhDRl9BU1NFUlQKLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwovLyAJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgY21kICkKLy8gI2VuZGlmIC8vIEhDRl9ERFMKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ05UTCwgY21kICkKCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CQkJCQkJCQkJCQkJCQkJCSAvKjIqLwovKjYqLwlyYyA9IGNtZF9leGUoIGlmYnAsIGNtZCwgMCApOwojaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCgkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOwkJCQkvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKI2VuZGlmIC8vIEhDRl9ERFMKCX0KI2lmIEhDRl9ETUEKCS8vIXJsYXYgOiBub3RlIHRoYXQgdGhpcyBwaWVjZSBvZiBjb2RlIGlzIGFsd2F5cyBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZiB0aGUgREVGVU5DVCBiaXQgaW4gSUZCX0NhcmRTdGF0LgoJLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZSBNU0Ygc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBpdHMgRE1BIHJlc291cmNlcyBiYWNrIGZyb20gdGhlIEhDRiwKCS8vIGV2ZW4gaWYgdGhlIGhhcmR3YXJlIGlzIGRpc2Z1bmN0aW9uYWwuIFByYWN0aWNhbCBleGFtcGxlIHVuZGVyIFdpbmRvd3MgOiBzdXJwcmlzZSByZW1vdmFsLgoJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CgkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOwoJCURFU0NfU1RSQ1QgKnA7CgkJaWYgKCBjbWQgPT0gSENGX0NOVExfRElTQUJMRSB8fCBjbWQgPT0gSENGX0NOVExfRU5BQkxFICkgewoJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsJCQkJCQkvKjgqLwoJCQlpZmJwLT5JRkJfQ250bE9wdCAmPSB+RE1BX0VOQUJMRUQ7CgkJfQoJCWlmICggY21kID09IEhDRl9DTlRMX0VOQUJMRSApIHsKCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19ETUFfQ1RSTCksIERNQV9DVFJMU1RBVF9HTyk7CgkJCS8qIDs/IGJ5IHJld3JpdGluZyBoY2ZfZG1hX3J4X3B1dCB5b3UgY2FuIHByb2JhYmx5IGp1c3QgY2FsbCBoY2ZfZG1hX3J4X3B1dCggaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkKCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKCQkJICovCgkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IERNQV9FTkFCTEVEOwoJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKCQkJLy8gbWFrZSB0aGUgZW50aXJlIHJ4IGRlc2NyaXB0b3IgY2hhaW4gRE1BLW93bmVkLCBzbyB0aGUgRE1BIGVuZ2luZSBjYW4gKHJlLSl1c2UgaXQuCgkJCWlmICggKCBwID0gaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdICkgIT0gTlVMTCApIHsgICAvLzs/IFRoaW5rIHRoaXMgb3ZlciBhZ2FpbiBpbiB0aGUgbGlnaHQgb2YgdGhlIG5ldyBjaGFpbmluZyBzdHJhdGVneQoJCQkJaWYgKCAxICkgCXsgLy9iZWdpbiBhbHRlcm5hdGl2ZQoJCQkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKQoJCQkJCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXSwgRE1BX1JYICk7CgkJCQkJaWYgKCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSB7CgkJCQkJCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXS0+bmV4dF9kZXNjX2FkZHIsIERNQV9SWCApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJd2hpbGUgKCBwICkgewoJCQkJCQkvL3AtPmJ1Zl9jbnRsLmNudGxfc3RhdCB8PSBERVNDX0RNQV9PV05FRDsKCQkJCQkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKCQkJCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCQkJCX0KCQkJCQkvLyBhIHJ4IGNoYWluIGlzIGF2YWlsYWJsZSBzbyBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKCQkJCQlwID0gaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdOwoJCQkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfUlhETUFfUFRSMzIpLCBwLT5kZXNjX3BoeXNfYWRkcik7CgkJCQl9ICAvL2VuZCBhbHRlcm5hdGl2ZQoJCQl9CgkJfQoJfQojZW5kaWYgLy8gSENGX0RNQQoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0NOVEwgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9jbnRsCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlpbnQgaGNmX2Nvbm5lY3QoIElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKQoqLlBVUlBPU0UJCUdyYW50cyBhY2Nlc3MgcmlnaHQgZm9yIHRoZSBIQ0YgdG8gdGhlIElGQi4KKgkJCQlJbml0aWFsaXplcyBDYXJkIGFuZCBIQ0YgaG91c2VrZWVwaW5nLgoqCiouQVJHVU1FTlRTCioJaWZicAkJKG5lYXIpIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWlvX2Jhc2UJCW5vbi1VU0I6IEkvTyBCYXNlIGFkZHJlc3Mgb2YgdGhlIE5JQyAoY29ubmVjdCkKKgkJCQlub24tVVNCOiBIQ0ZfRElTQ09OTkVDVAoqCQkJCVVTQjoJIEhDRl9DT05ORUNULCBIQ0ZfRElTQ09OTkVDVAoqCiouUkVUVVJOUwoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9JTkNPTVBfUFJJCioJSENGX0VSUl9JTkNPTVBfRlcKKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQoqISEJSENGX0VSUl9OT19OSUMgcmVhbGx5IHJldHVybmVkIDs/CioJSENGX0VSUl9OT19OSUMKKglIQ0ZfRVJSX1RJTUVfT1VUCioKKglNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrOgoqCUlGQl9JT0Jhc2UJCQkJZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKKglJRkJfSU9SYW5nZQkJCQlIUkVHX0lPX1JBTkdFICgweDQwLzB4ODApCioJSUZCX1ZlcnNpb24JCQkJdmVyc2lvbiBvZiB0aGUgSUZCIGxheW91dAoqCUlGQl9GV0lkZW50aXR5CQkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIGlkZW50aXR5IG9mIHRoZQoqCQkJCQkJCSJydW5uaW5nIiBGL1csIGkuZS4gdGVydGlhcnkgRi9XIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zCioJSUZCX0ZXU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgc3VwcGxpZXIgcmFuZ2Ugb2YKKgkJCQkJCQl0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKglJRkJfSFNJU3VwCQkJCUNGR19TVVBfUkFOR0VfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSFcvU1cgSS9GIHJhbmdlIG9mIHRoZSBOSUMKKglJRkJfUFJJSWRlbnRpdHkJCQlDRkdfUFJJX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIElkZW50aXR5IG9mIHRoZSBQcmltYXJ5IEYvVwoqCUlGQl9QUklTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZiB0aGUgUHJpbWFyeSBGL1cKKglhbGwgb3RoZXIJCQkJYWxsIE1TRiBhY2Nlc3NpYmxlIGZpZWxkcywgd2hpY2ggYXJlIG5vdCBzcGVjaWZpZWQgYWJvdmUsIGFyZSB6ZXJvLWZpbGxlZAoqCiouQ09ORElUSU9OUwoqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGFzc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIEkvTyBCYXNlIGFkZHJlc3MuCioKKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKiB3YXMgY2FsbGVkLgoqCiouREVTQ1JJUFRJT04KKiBoY2ZfY29ubmVjdCBwYXNzZXMgdGhlIE1TRi1kZWZpbmVkIGxvY2F0aW9uIG9mIHRoZSBJRkIgdG8gdGhlIEhDRiBhbmQgZ3JhbnRzIG9yIHJldm9rZXMgYWNjZXNzIHJpZ2h0IGZvciB0aGUKKiBIQ0YgdG8gdGhlIElGQi4gUmV2b2tpbmcgaXMgZG9uZSBieSBzcGVjaWZ5aW5nIEhDRl9ESVNDT05ORUNUIHJhdGhlciB0aGFuIGFuIEkvTyBhZGRyZXNzIGZvciB0aGUgcGFyYW1ldGVyCiogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKKiBpbiAiZGlzY29ubmVjdCIgbW9kZS4gQ2xhbGxpbmcgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiLyJkaXNjb25uZWN0IiBtb2RlIGNhbiBub3QgYmUgbmVzdGVkLgoqIFRoZSBJRkIgYWRkcmVzcyBtdXN0IGJlIHVzZWQgYXMgYSBoYW5kbGUgd2l0aCBhbGwgc3Vic2VxdWVudCBIQ0YtZnVuY3Rpb24gY2FsbHMgYW5kIHRoZSBIQ0YgdXNlcyB0aGUgSUZCCiogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCioKKiBOb3RlIHRoYXQgbm90IG9ubHkgdGhlIE1TRiBhY2Nlc3NpYmxlIGZpZWxkcyBhcmUgY2xlYXJlZCwgYnV0IGFsc28gYWxsIGludGVybmFsIGhvdXNla2VlcGluZwoqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgoqIFRoaXMgaW1wbGllcyB0aGF0IGFsbCBzZXR0aW5ncyB3aGljaCBhcmUgZG9uZSB2aWEgaGNmX2FjdGlvbiBhbmQgaGNmX3B1dF9pbmZvIChlLmcuIENGR19NQl9BU1NFUlQsIENGR19SRUdfTUIsCiogQ0ZHX1JFR19JTkZPX0xPRykgbXVzdCBiZSBkb25lIGFnYWluLiBUaGUgb25seSBmaWVsZCB3aGljaCBpcyBub3QgY2xlYXJlZCwgaXMgSUZCX01TRlN1cC4KKgoqIElmIEhDRl9JTlRfT04gaXMgc2VsZWN0ZWQgYXMgY29tcGlsZSBvcHRpb24sIE5JQyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBpcyBub3QgcHJvcGVybHkgYWxpZ25lZCAoIHJlZiBjaGFwdGVyIEhDRl9BTElHTiBpbiA0LjEuMSkKKiAtIEkvTyBCYXNlIEFkZHJlc3MgaXMgbm90IGEgbXVsdGlwbGUgb2YgMHg0MCAobm90ZTogMHgwMDAwIGlzIGV4cGxpY2l0bHkgYWxsb3dlZCkuCioKKi5ESUFHUkFNCioKKjA6CVRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcwoqCXNvbWUgYXR0ZW50aW9uIGFib3V0IHdoYXQgdG8gdXNlIGFzICJJL08iIGFkZHJlc3Mgd2hlbiBmb3Igd2hpY2ggcHVycG9zZS4KKjI6CioyYTogUmVzZXQgSC1JSSBieSB0b2dnbGluZyByZXNldCBiaXQgaW4gSU8tcmVnaXN0ZXIgb24gYW5kIG9mZi4KKglUaGUgSENGX1RZUEVfUFJFTE9BREVEIGNhdGVycyBmb3IgdGhlIERPUyBlbnZpcm9ubWVudCB3aGVyZSBILUlJIGlzIGxvYWRlZCBieSBhIHNlcGFyYXRlIHByb2dyYW0gdG8KKglvdmVyY29tZSB0aGUgNjRrIHNpemUgbGltaXQgcG9zZWQgb24gRE9TIGRyaXZlcnMuCioJVGhlIG1hY3JvIE9QVyBpcyBub3QgeWV0IHVzZWFibGUgYmVjYXVzZSB0aGUgSUZCX0lPQmFzZSBmaWVsZCBpcyBub3Qgc2V0LgoqCU5vdGUgMTogaG9wZWZ1bGx5IHRoZSBjbGVhcmluZyBhbmQgaW5pdGlhbGl6aW5nIG9mIHRoZSBJRkIgKHNlZSBiZWxvdykgYWN0cyBhcyBhIGRlbGF5IHdoaWNoIG1lZXRzIHRoZQoqCXNwZWNpZmljYXRpb24gZm9yIFMvVyByZXNldAoqCU5vdGUgMjogaXQgdHVybnMgb3V0IHRoYXQgb24gc29tZSBIL1cgY29uc3RlbGxhdGlvbnMsIHRoZSBjbG9jayB0byBhY2Nlc3MgdGhlIEVFUHJvbSBpcyBub3QgbG93ZXJlZAoqCXRvIGFuIGFwcHJvcHJpYXRlIGZyZXF1ZW5jeSBieSBIUkVHX0lPX1NSRVNFVC4gQnkgZ2l2aW5nIGFuIEhDTURfSU5JIGZpcnN0LCB0aGlzIHByb2JsZW0gaXMgd29ya2VkIGFyb3VuZC4KKjJiOiBFeHBlcmltZW50YWxseSBpdCBpcyBkZXRlcm1pbmVkIG92ZXIgYSB3aWRlIHJhbmdlIG9mIEYvVyB2ZXJzaW9ucyB0aGF0IHdhaXRpbmcgZm9yIHRoZSBmb3IgQ21kIGJpdCBpbgoqCUV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCio0OgljbGVhciBhbmQgaW5pdGlhbGl6ZSB0aGUgSUZCCioJVGhlIEhDRiBob3VzZSBrZWVwaW5nIGluZm8gaXMgZGVzaWduZWQgc3VjaCB0aGF0IHplcm8gaXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgdmFsdWUgZm9yIGFzIG11Y2ggYXMKKglmZWFzaWJsZSBJRkItaXRlbXMuCioJVGhlIHJlYWRhYmxlIGZpZWxkcyBtZW50aW9uZWQgaW4gdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYW5kIHNvbWUgSENGIHNwZWNpZmljIGZpZWxkcyBhcmUgZ2l2ZW4gdGhlaXIKKglhY3R1YWwgdmFsdWUuCioJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgYmVzdCBndWVzcyBiZWZvcmUgY2FsaWJyYXRpb24KKglIY2ZfY29ubmVjdCBkZWZhdWx0cyB0byAibm8gaW50ZXJydXB0IGdlbmVyYXRpb24iIChpbXBsaWNpdGx5IGFjaGlldmVkIGJ5IHRoZSB6ZXJvLWZpbGxpbmcpLgoqNjoJUmVnaXN0ZXIgY29tcGlsZS10aW1lIGxpbmtlZCBNU0YgUm91dGluZSBhbmQgc2V0IGRlZmF1bHQgZmlsdGVyIGxldmVsCioJY2FzdCBuZWVkZWQgdG8gZ2V0IGFyb3VuZCB0aGUgIm5lYXIiIHByb2JsZW0gaW4gRE9TIENPTSBtb2RlbAoqCWVyIEMyNDQ2OiBubyBjb252ZXJzaW9uIGZyb20gdm9pZCAoX19uZWFyIF9fY2RlY2wgKikodW5zaWduZWQgY2hhciBfX2ZhciAqLHVuc2lnbmVkIGludCx1bnNpZ25lZCBzaG9ydCxpbnQpCioJCQkJCQkJdG8gICB2b2lkIChfX2ZhciAgX19jZGVjbCAqKSh1bnNpZ25lZCBjaGFyIF9fZmFyICosdW5zaWduZWQgaW50LHVuc2lnbmVkIHNob3J0LGludCkKKjg6CUlmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKKglibG9ja2VkIGNtZCBwaXBlIGxpbmUuICBUbyB1bmJsb2NrIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgZG9uZToKKgkgLSBBY2sgZXZlcnl0aGluZwoqCSAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgoqCSAtIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgoqCVRoZSB0d28gd2FpdHMgYXJlIGNvbWJpbmVkIGluIGEgc2luZ2xlIEhDRl9XQUlUX1dISUxFIHRvIG9wdGltaXplIG1lbW9yeSBzaXplLiBJZiBlaXRoZXIgb2YgdGhlc2Ugd2FpdHMKKglmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCioJbmV4dCBjbWRfZXhlIHdpbGwgZmFpbCwgY2F1c2luZyB0aGUgSENGIHRvIGdvIGludG8gREVGVU5DVCBtb2RlCioxMDoJQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSBibG9ja2VkKSBjbWQgcGlwZSBsaW5lCioJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcwoqCXBlbmRpbmcgb24gbm9uLWluaXRpYWwgY2FsbHMKKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCioJSGVybWVzIEluaXRpYWxpemUKKjEyOglPbmx5IEgtSUkgTkVFRFMgdGhlIEhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIER1ZSB0byB0aGUgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgSC1JIGFuZCBILUlJCioJSW5pdGlhbGl6ZSBjb21tYW5kLCBpbml0KCkgZG9lcyBub3QgKGFuZCBjYW4gbm90LCBzaW5jZSBpdCBpcyBjYWxsZWQgZS5nLiBhZnRlciBhIGRvd25sb2FkKSBleGVjdXRlIHRoZQoqCUhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIEV4ZWN1dGluZyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZCBmb3IgSC1JIHdvdWxkIG5vdCBoYXJtIGJ1dCBub3QgZG8KKglhbnl0aGluZyB1c2VmdWwgZWl0aGVyLCBzbyBpdCBpcyBza2lwcGVkLgoqCVRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF9leGUgaXMgaWdub3JlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IGlmIGNtZF9leGUgZmFpbHMsIGluaXQgZmFpbHMgdG9vCioxNDoJdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQoqCXRoZSBjYWxsIHRvIGluaXQgYW5kIGl0cyBzdWJzZXF1ZW50IGNhbGwgb2YgY21kX2V4ZSB3aWxsIHJldHVybiBIQ0ZfRVJSX05PX05JQyBpZiBhcHByb3ByaWF0ZS4gVGhpcyBzdGF0dXMKKglpcyAoYmFkbHkpIG5lZWRlZCBieSBzb21lIGxlZ2FjeSBjb21iaW5hdGlvbiBvZiBOVDQgYW5kIGNhcmQgc2VydmljZXMgd2hpY2ggZG8gbm90IHlpZWxkIGFuIEkvTyBhZGRyZXNzIGluCioJdGltZS4KKgoqLk5PVElDRQoqCU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgTlVMTC1wb2ludGVyIGlzIG5vdCBhIGJpdC1wYXR0ZXJuIG9mIGFsbCB6ZXJvcywgdGhlIHplcm8tZmlsbGluZyBvZiB0aGUgSUZCIHJlc3VsdHMKKglpbiBhbiBpbmNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgcG9pbnRlcnMuCioJVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNYWlsQm94IG1hbmlwdWxhdGlvbiBpbiBwdXRfbWJfaW5mbyBwcm90ZWN0cyBhZ2FpbnN0IHRoZSBhYnNlbmNlIG9mIGEgTWFpbEJveAoqCWJhc2VkIG9uIElGQl9NQlNpemUsIElGQl9NQldwIGFuZCBpZmJwLT5JRkJfTUJScC4gVGhpcyBoYXMgcmFtaWZpY2F0aW9ucyBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCioJTWFpbEJveCB2aWEgaGNmX3B1dF9pbmZvIHdpdGggdGhlIENGR19SRUdfTUIgdHlwZSwgYnV0IGl0IHByZXZlbnRzIGRlcGVuZGVuY3kgb24gdGhlICJOVUxMLSJuZXNzIG9mCioJSUZCX01CcC4KKgoqLk5PVElDRQoqCVRoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ibGVtcyB3aGVuIGFzc2VydGluZyBhbmQgbG9nZ2luZyBoY2ZfY29ubmVjdCwgZS5nLgoqCSAtIEFzc2VydGluZyBvbiByZS1lbnRyYW5jeSBvZiBoY2ZfY29ubmVjdCBieSBtZWFucyBvZgoqCSAiSENGQVNTRVJUKCAoaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgSENGX0FTU0VSVF9DT05ORUNUKSA9PSAwLCAwICkiIGlzIG5vdCB1c2VmdWwgYmVjYXVzZSBJRkIgY29udGVudHMKKgkgYXJlIHVuZGVmaW5lZAoqCSAtIEFzc2VydGluZyBiZWZvcmUgdGhlIElGQiBpcyBjbGVhcmVkIHdpbGwgY2F1c2UgbWRkX2Fzc2VydCgpIHRvIGludGVycHJldCB0aGUgZ2FyYmFnZSBpbiBJRkJfQXNzZXJ0UnRuCioJIGFzIGEgcm91dGluZSBhZGRyZXNzCioJVGhlcmVmb3JlIEhDRlRSQUNFIG5vciBIQ0ZMT0dFTlRSWSBpcyBjYWxsZWQgYnkgaGNmX2Nvbm5lY3QuCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2Nvbm5lY3QoIElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKQp7CmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl9pbwkJaW9fYWRkcjsKaGNmXzMyCQlwcm90X2NudDsKaGNmXzgJCSpxOwpMVFZfU1RSQ1QJeDsKI2lmIEhDRl9BU1NFUlQKCWhjZl8xNiB4YSA9IGlmYnAtPklGQl9GV0lkZW50aXR5LnR5cDsKCS8qIGlzIGFzc3VtZWQgdG8gY2F1c2UgYW4gYXNzZXJ0IGxhdGVyIG9uIGlmIGhjZl9jb25uZWN0IGlzIGNhbGxlZCB3aXRob3V0IGludGVydmVuaW5nIGhjZl9kaXNjb25uZWN0LgoJICogeGEgPT0gQ0ZHX0ZXX0lERU5USVRZIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aG91dCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAwIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCgkgKiB4YSA9PSAiZ2FyYmFnZSIgKGFueSB2YWx1ZSBleGNlcHQgQ0ZHX0ZXX0lERU5USVRZIGlzIGFjY2VwdGFibGUpIGluIHRoZSBpbml0aWFsIGNhbGwKCSAqLwojZW5kaWYgLy8gSENGX0FTU0VSVAoKCWlmICggaW9fYmFzZSA9PSBIQ0ZfRElTQ09OTkVDVCApIHsJCQkJCS8vZGlzY29ubmVjdAoJCWlvX2FkZHIgPSBpZmJwLT5JRkJfSU9CYXNlOwoJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsJCS8vOz93b3JrYXJvdW5kIGFnYWluc3QgZHlpbmcgRi9XIG9uIHN1YnNlcXVlbnQgaGNmX2Nvbm5lY3QgY2FsbHMKCX0gZWxzZSB7CQkJCQkJCQkJCQkvL2Nvbm5lY3QJCQkJCQkJCS8qIDAgKi8KCQlpb19hZGRyID0gaW9fYmFzZTsKCX0KCiNpZiAwIC8vOz8gaWYgYSBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGlzIHByZWNlZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKI2lmIEhDRl9TTEVFUAogICAgT1VUX1BPUlRfV09SRCggLi4uLi4rSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgoJbm90ZSB0aGF0IE1TRl9XQUlUIHVzZXMgbm90IHlldCBkZWZpbmVkISEhISBJRkJfSU9CYXNlIGFuZCBJRkJfVGlja0luaSAodmlhIFBST1RfQ05UX0lOSSkKCXNvIGJlIGNhcmVmdWxsIGlmIHRoaXMgY29kZSBpcyByZXN0b3JlZAojZW5kaWYgLy8gSENGX1NMRUVQCiNlbmRpZiAvLyAwCgojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCglPVVRfUE9SVF9XT1JEKCBpb19hZGRyICsgSFJFR19DTUQsIEhDTURfSU5JICk7ICAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQoJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CglIQ0ZfV0FJVF9XSElMRSggKElOX1BPUlRfV09SRCggaW9fYWRkciArICBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCU9VVF9QT1JUX1dPUkQoIChpb19hZGRyICsgSFJFR19JTyksIEhSRUdfSU9fU1JFU0VUICk7CS8vT1BXIG5vdCB5ZXQgdXNlYWJsZQkJCQkJLyogMmEqLwojZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECglmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCglpZmJwLT5JRkJfTWFnaWMJCT0gSENGX01BR0lDOwoJaWZicC0+SUZCX1ZlcnNpb24JPSBJRkJfVkVSU0lPTjsKI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAvL2EgbmV3IElGQiBkZW1vbnN0cmF0ZXMgaG93IGRpcnR5IHRoZSBzb2x1dGlvbiBpcwoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVRdID0gTlVMTDsJCS8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyCTB4RkQwMgoJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSBOVUxMOwkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMwojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAojaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKCWlmYnAtPklGQl9UYWxseUxlbiA9IDEgKyAyICogKEhDRl9OSUNfVEFMX0NOVCArIEhDRl9IQ0ZfVEFMX0NOVCk7CS8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCglpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgoJaWZicC0+SUZCX0lPQmFzZQk9IGlvX2FkZHI7CQkJCS8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKCWlmYnAtPklGQl9DbnRsT3B0CT0gVVNFXzE2QklUOwojaWYgSENGX0FTU0VSVAoJYXNzZXJ0X2lmYnAgPSBpZmJwOwoJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDE7CiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCglpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CgkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IChNU0ZfQVNTRVJUX1JUTlApbXNmX2Fzc2VydDsJCQkJCQkJCQkJCS8qIDYgKi8KCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIJCQkJLy9idWlsZCB0aGUgc3RydWN0dXJlIHRvIHBhc3MgdGhlIGFzc2VydCBpbmZvIHRvIGhjZl9wdXRfaW5mbwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmxlbiA9IHNpemVvZihpZmJwLT5JRkJfQXNzZXJ0U3RyY3QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5iYXNlX3R5cCA9IENGR19NQl9BU1NFUlQ7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19jbnQgPSAxOwoJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmZyYWdfYnVmWzBdLmZyYWdfbGVuID0KCQkoIG9mZnNldG9mKElGQl9TVFJDVCwgSUZCX0Fzc2VydEx2bCkgLSBvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9Bc3NlcnRMaW5lKSApIC8gc2l6ZW9mKGhjZl8xNik7CglpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuZnJhZ19idWZbMF0uZnJhZ19hZGRyID0gJmlmYnAtPklGQl9Bc3NlcnRMaW5lOwojZW5kaWYgLy8gSENGX0FTU0VSVF9NQgojZW5kaWYgLy8gSENGX0FTU0VSVAoJSUZfUFJPVF9USU1FKCBwcm90X2NudCA9IGlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOyApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCgkvLyEhIE5vIGFzc2VydHMgYmVmb3JlIFJlc2V0LWJpdCBpbiBIUkVHX0lPIGlzIGNsZWFyZWQKCU9QVyggSFJFR19JTywgMHgwMDAwICk7CQkJCQkJLy9PUFcgdXNlYWJsZQkJCQkJCQkJCQkvKiAyYiovCglIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CglJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkKCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCApIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7ICkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCglIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYwICkJKSAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCglIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCglIQ0ZBU1NFUlQoICgoaGNmXzMyKSh2b2lkKilpZmJwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpKHZvaWQqKWlmYnAgKQoJSENGQVNTRVJUKCAoaW9fYWRkciAmIDB4MDAzRikgPT0gMCwgaW9fYWRkciApCgkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCglpZiAoSVBXKCBIUkVHX0NNRCApICYgSENNRF9CVVNZICkgewkJCQkJCQkJCQkJCQkJCQkvKiA4ICovCgkJCQkJCQkJCQkJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBCdXN5IGJpdCBkcm9wICBpbiBDbWQgcmVnaXN0ZXIKCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSAmJiAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkgLyogaWYgcHJvdF9jbnQgPT0gMCwgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgREVGVU5DVCAqLwoJfQoJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCQkJCQkJCQkJCQkJCQkvKjEyKi8KCSh2b2lkKWNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKaWYgKCBpb19iYXNlICE9IEhDRl9ESVNDT05ORUNUICkgewoJCXJjID0gaW5pdCggaWZicCApOwkJCQkJCQkJCQkJCQkJCQkJCQkvKjE0Ki8KCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewoJCQl4LmxlbiA9IDI7CgkJCXgudHlwID0gQ0ZHX05JQ19CVVNfVFlQRTsKCQkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAmeCApOwoJCQlpZmJwLT5JRkJfQnVzVHlwZSA9IHgudmFsWzBdOwoJCQkvL0NGR19OSUNfQlVTX1RZUEUgbm90IHN1cHBvcnRlZCAtPiBkZWZhdWx0IDMyIGJpdHMvRE1BLCBNU0YgaGFzIHRvIG92ZXJydWxlIHZpYSBDRkdfQ05UTF9PUFQKCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCQkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfMTZCSVQ7CQkJLy9yZXNldCBVU0VfMTZCSVQKI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKI2lmIEhDRl9ETUEKCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7CQkJCS8vU0VUIERNQQojZWxzZQoJCQkJaWZicC0+SUZCX0lPUmFuZ2UgPSAweDQwIC8qaS5zLm8uIEhSRUdfSU9fUkFOR0UqLzsKI2VuZGlmIC8vIEhDRl9ETUEKCQkJfQoJCX0KCX0gZWxzZSBIQ0ZBU1NFUlQoICAoIGlmYnAtPklGQl9NYWdpYyBePSBIQ0ZfTUFHSUMgKSA9PSAwLCBpZmJwLT5JRkJfTWFnaWMgKSAvKk5PUCovOwoJLyogb2YgYWJvdmUgSENGQVNTRVJUIG9ubHkgdGhlIHNpZGUgZWZmZWN0IGlzIG5lZWRlZCwgTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15ICovCglpZmJwLT5JRkJfSU9CYXNlID0gaW9fYmFzZTsJCQkJCQkJCQkJCQkJCQkJCQkvKiAwKi8KCXJldHVybiByYzsKfSAvLyBoY2ZfY29ubmVjdAoKI2lmIEhDRl9ETUEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEZ1bmN0aW9uIGdldF9mcmFtZV9sc3QKKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCioKKiBUaGUgRnJhbWVMaXN0IHRvIGJlIHJlY2xhaW1lZCBhcyB3ZWxsIGFzIHRoZSBEZXNjcmlwdG9yTGlzdCBhbHdheXMgc3RhcnQgaW4gSUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXQoqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCioKKiBJZiBhIEZyYW1lTGlzdCBpcyBhdmFpbGFibGUsIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCB0byB0dXJuZWQgaW50byBhIG5ldyBERUxXQSBEZXNjcmlwdG9yOgoqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CioJIERFTFdBIERlc2NyaXB0b3IKKiAgLSB0aGUgcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3B5IGJ5IHNldHRpbmcgdGhlIG5leHRfZGVzY19hZGRyIGF0IE5VTEwKKiAgLSB0aGUgRE1BIGNvbnRyb2wgYml0cyBvZiB0aGUgY29weSBhcmUgY2xlYXJlZCB0byBkbyBub3QgY29uZnVzZSB0aGUgTVNGCiogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCioJIG9mIHRoZSBGcmFtZUxpc3QsIHRodXMgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBsYXN0IERlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdC4KKiAgLSBJRkJfRmlyc3REZXNjIGlzIGNoYW5nZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhhdCByZXBsYWNlZCAob3JpZ2luYWwpIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LAoqCSBpLmUuIHRoZSAibmV3IiBERUxXQSBEZXNjcmlwdG9yLgoqCiogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCiogT24gdG9wIG9mIHRoYXQsIGl0IGFkanVzdHMgRE1BIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBJRkIgc3RydWN0dXJlLgoJLy8gcGVyZm9ybSBhIGNvcHlpbmctc2NoZW1lIHRvIGNpcmN1bXZlbnQgdGhlICdsYXN0IGhvc3Qgb3duZWQgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmVjbGFpbWVkJyBsaW1pdGF0aW9uIGltcG9zZWQgYnkgSDIuNSdzIERNQSBoYXJkd2FyZSBkZXNpZ24KCS8vIGEgJ3JlY2xhaW0gZGVzY3JpcHRvcicgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgSENGOgoqCiogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CioKIDg6IEJlIGNhcmVmdWwgb25jZSB5b3Ugc3RhcnQgcmUtb3JkZXJpbmcgdGhlIHN0ZXBzIGluIHRoZSBjb3B5IHByb2Nlc3MsIHRoYXQgaXQgc3RpbGwgd29ya3MgZm9yIGNhc2VzCiogCW9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCmdldF9mcmFtZV9sc3QoIElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcgKQp7CgpERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKREVTQ19TVFJDVCAqY29weSwgKnAsICpwcmV2OwoKCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKQoJCQkJCQkJCS8vaWYgRnJhbWVMaXN0CglpZiAoIGhlYWQgKSB7CgkJCQkJCQkJLy8uICBzZWFyY2ggZm9yIGxhc3QgZGVzY3JpcHRvciBvZiBmaXJzdCBGcmFtZUxpc3QKCQlwID0gcHJldiA9IGhlYWQ7CgkJd2hpbGUgKCAoIHAtPkJVRl9TSVpFICYgREVTQ19FT1AgKSA9PSAwICYmIHAtPm5leHRfZGVzY19hZGRyICkgewoJCQlpZiAoICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApID09IDAgKSB7CS8vY2xlYXIgY29udHJvbCBiaXRzIHdoZW4gZGlzYWJsZWQKCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKCQkJfQoJCQlwcmV2ID0gcDsKCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJCX0KCQkJCQkJCQkvLy4gIGlmIERNQSBlbmFibGVkCgkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgewoJCQkJCQkJCS8vLiAgLiAgaWYgbGFzdCBkZXNjcmlwdG9yIG9mIEZyYW1lTGlzdCBpcyBETUEgb3duZWQKCQkJCQkJCQkvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCgkJCWlmICggcC0+QlVGX0NOVCAmIERFU0NfRE1BX09XTkVEIHx8IGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CgkJCQkJCQkJLy8uICAuICAuICByZWZ1c2UgdG8gcmV0dXJuIEZyYW1lTGlzdCB0byBjYWxsZXIKCQkJCWhlYWQgPSBOVUxMOwoJCQl9CgkJfQoJfQoJCQkJCQkJCS8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKCWlmICggaGVhZCApIHsKCQkJCQkJCQkvLy4gIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yIChpbXBsaWVzIERNQSBkaXNhYmxlZCkKIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewoJCQkJCQkJCS8vLiAgLiAgY2xlYXIgRGVzY3JpcHRvckxpc3QKCQkJLyo7P2lmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9Ki8gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IE5VTEw7CgkJCQkJCQkJLy8uICBlbHNlCgkJfSBlbHNlIHsKCQkJCQkJCQkvLy4gIC4gIHN0cmlwIGhhcmR3YXJlLXJlbGF0ZWQgYml0cyBmcm9tIGxhc3QgZGVzY3JpcHRvcgoJCQkJCQkJCS8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CgkJCWNvcHkgPSBoZWFkOwoJIAkJaGVhZCA9IGhlYWQtPm5leHRfZGVzY19hZGRyOwoJCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKCQkJY29weS0+YnVmX3BoeXNfYWRkciA9IHAtPmJ1Zl9waHlzX2FkZHI7CgkJCWNvcHktPmJ1Zl9hZGRyID0gcC0+YnVmX2FkZHI7CgkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAoJCQljb3B5LT5CVUZfQ05UID0gcC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOwkvL2dldCByaWQgb2YgREVTQ19ETUFfT1dORUQKI2lmIChIQ0ZfRVhUKSAmIEhDRl9ERVNDX1NUUkNUX0VYVAoJCQljb3B5LT5ERVNDX01TRlN1cCA9IHAtPkRFU0NfTVNGU3VwOwojZW5kaWYgLy8gSENGX0RFU0NfU1RSQ1RfRVhUCgkJCQkJCQkJLy8uICAuICB0dXJuIGludG8gYSBERUxXQSBEZXNjcmlwdG9yCgkJCXAtPmJ1Zl9hZGRyID0gTlVMTDsKCQkJCQkJCQkvLy4gIC4gIGNoYWluIGNvcHkgdG8gcHJldgkJCQkJCQkJCQkJLyogOCovCgkJCXByZXYtPm5leHRfZGVzY19hZGRyID0gY29weTsKCQkJCQkJCQkvLy4gIC4gIGRldGFjaCByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGZyb20gRnJhbWVMaXN0CgkJCWNvcHktPm5leHRfZGVzY19hZGRyID0gTlVMTDsKCQkJY29weS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDB4REVBRDAwMDA7IC8vISBqdXN0IHRvIGJlIG5pY2UsIG5vdCByZWFsbHkgbmVlZGVkCgkJCQkJCQkJLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYwoJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJCQkJCQkJLy8uICBzdHJpcCBERVNDX1NPUCBmcm9tIGZpcnN0IGRlc2NyaXB0b3IKCQloZWFkLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwoJCS8vaGVhZC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAoJCWhlYWQtPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAoJfQoJCQkJCQkJCS8vcmV0dXJuIHRoZSBqdXN0IGRldGFjaGVkIEZyYW1lTGlzdCAoaWYgYW55KQoJcmV0dXJuIGhlYWQ7Cn0gLy8gZ2V0X2ZyYW1lX2xzdAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBGdW5jdGlvbiBwdXRfZnJhbWVfbHN0CioKKiBUaGlzIGZ1bmN0aW9uCioKKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKgoqIElucHV0IHBhcmFtZXRlcnM6CiogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCioKKiBUaGUgZm9sbG93aW5nIGxpc3Qgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhjZl9kbWFfdHgvcnhfcHV0LCBpbiBvcmRlciB0byBnZXQgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIEFzc2VydCBmYWlscyBpZgoqIC0JRE1BIGlzIG5vdCBlbmFibGVkCiogLQlkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0JYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtCWEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0JdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtCWEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqIC0JUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoKKi5OT1RJQ0UKKiBUaGUgYXNzZXJ0cyBtYXJrZWQgd2l0aCAqc2MqIGFyZSByZWFsbHkgc2FuaXR5IGNoZWNrcyBmb3IgdGhlIEhDRiwgdGhleSBjYW4gKHN1cHBvc2VkbHkpIG5vdCBiZSBpbmZsdWVuY2VkCiogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgoKCQkvLyBUaGUgTVNGIGlzIHJlcXVpcmVkIHRvIHN1cHBseSB0aGUgSENGIHdpdGggYSBzaW5nbGUgZGVzY3JpcHRvciBmb3IgTVNGIHR4IHJlY2xhaW0gcHVycG9zZXMuCgkJLy8gVGhpcyAncmVjbGFpbSBkZXNjcmlwdG9yJyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgZmFjdCB0aGF0IGl0cyBidWZfYWRkciBmaWVsZCBpcyB6ZXJvLgoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgkqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmU6CgkqIC0gbWFrZSBlYWNoIGRlc2NyaXB0b3IgaW4gdGhpcyByeC1jaGFpbiBETUEtb3duZWQuCgkqIC0gQWxzbyBzZXQgdGhlIGNvdW50IHRvIHplcm8uIEVPUCBhbmQgU09QIGJpdHMgYXJlIGFsc28gY2xlYXJlZC4KCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFtZV9sc3QoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGludCB0eF9yeF9mbGFnICkKewoJREVTQ19TVFJDVAkqcCA9IGRlc2NwOwoJaGNmXzE2IHBvcnQ7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECglIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICkKCUhDRkFTU0VSVCggcCAsIDAgKQoKCXdoaWxlICggcCApIHsKCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQoJCUhDRkFTU0VSVCggKHAtPkJVRl9TSVpFICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9TSVpFICkKCQlwLT5CVUZfU0laRSAmPSBERVNDX0NOVF9NQVNLOwkJCQkJLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCgkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKCQlpZiAoIHAtPm5leHRfZGVzY19hZGRyICkgewovLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKQoJCQlIQ0ZBU1NFUlQoIHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkciwgKGhjZl8zMilwLT5uZXh0X2Rlc2NfYWRkciApCgkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHI7CgkJfSBlbHNlIHsJCQkJCQkJCQkvLwoJCQlwLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMDsKCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgewkJCS8vIERFTFdBIERlc2NyaXB0b3IKCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApCS8vc2luZ2xldG9uIERlc2NyaXB0b3JMaXN0CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddKQoJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pCgkJCQlkZXNjcC0+QlVGX0NOVCA9IDA7IC8vJj0gfkRFU0NfRE1BX09XTkVEOwoJCQkJaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOwovLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9IGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKCQkJCQkJCQkJCQkJCS8vIGlmICJyZWN5Y2xpbmciIGEgRnJhbWVMaXN0CgkJCQkJCQkJCQkJCQkvLyAoZS5nLiBjYWxsZWQgZnJvbSBoY2ZfY250bCggSENGX0NOVExfRU5BQkxFICkKCQkJCQkJCQkJCQkJCS8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKCQkJfSBlbHNlIHsJCQkJCQkJCS8vYSAicmVhbCIgRnJhbWVMaXN0LCBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCwKCQkJCQkJICAgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyKQovLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID0gZGVzY3A7CgkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CgkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKCQkJCWlmICggdHhfcnhfZmxhZyApIHsKCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsJLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CgkJCQkJcG9ydCA9IEhSRUdfVFhETUFfUFRSMzI7CgkJCQl9CgkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CgkJCX0KCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKCQl9CgkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwoJfQp9IC8vIHB1dF9mcmFtZV9sc3QKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0KCBJRkJQIGlmYnAgKQoqLlBVUlBPU0UJCWRlY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgcHJvdmlkZXMgdGhhdCBtZXNzYWdlIHRvIHRoZSBNU0YuCioJCQkJcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglwb2ludGVyIHRvIGEgRnJhbWVMaXN0CioKKi5ERVNDUklQVElPTgoqIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCiogRE1BIGVuZ2luZS4gSW4gYWRkaXRpb24gaGNmX2RtYV9yeF9nZXQgY2FuIGJlIHVzZWQgdG8gcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4KKiB3aGVuIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCBlLmcuIGFzIHBhcnQgb2YgYSBkcml2ZXIgdW5sb2FkaW5nIHN0cmF0ZWd5LgoqIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCiogdGhyb3VnaCB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIG9mIElGQl9EbWFQYWNrZXRzLiBUaGUgY2FsbGluZyBtdXN0IHN0b3Agd2hlbiBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZCwgYXQKKiB3aGljaCB0aW1lIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgaXMgYWxzbyBjbGVhcmVkIGJ5IHRoZSBIQ0YgdG8gYXJtIHRoZSBtZWNoYW5pc20gZm9yIHRoZSBuZXh0IGZyYW1lCiogcmVjZXB0aW9uLgoqIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgRE1BIEVuZ2luZSBpcyBjdXJyZW50bHkgZW5hYmxlZCAoYXMgY29udHJvbGxlZCB2aWEgaGNmX2NudGwpLCBpZiB0aGUgRE1BIGNvbnRyb2xsZXIKKiBkZXBvc2l0ZWQgYW4gUngtZnJhbWUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGlzIGZyYW1lIGlzIGRldGFjaGVkIGZyb20gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LAoqIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQoqIGNhbGxlci4KKiBJZiBubyBzdWNoIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3J4X2dldCBkZXBlbmRzIG9uIHRoZQoqIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBlbmFibGVkLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcyB1c2VkOgoqIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCiogLSBJZiB0aGVyZSBpcyBubyBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgcmV0dXJuZWQuCiogLSBJZiB0aGVyZSBpcyBubyBERUxXQSBEZXNjcmlwdG9yLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKgoqIElmIHRoZSBNU0YgcGVyZm9ybXMgYW4gZGlzYWJsZS9lbmFibGUgc2VxdWVuY2Ugd2l0aG91dCBleGhhdXN0aW5nIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCBhcyBkZXNjcmliZWQgYWJvdmUsCiogdGhlIGVuYWJsZSBjb21tYW5kIHdpbGwgcmVzZXQgYWxsIGhvdXNlIGtlZXBpbmcgaW5mb3JtYXRpb24sIGkuZS4gYWxyZWFkeSByZWNlaXZlZCBidXQgbm90IHlldCBieSB0aGUgTVNGCiogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KKgoqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBkZWNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgoqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgoqIElmIGFwcHJvcHJpYXRlLCBkZWNhcHN1bGF0aW9uIGlzIGRvbmUgYnkgbW92aW5nIHNvbWUgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlcnMgYW5kIHVwZGF0aW5nIHRoZSBkZXNjcmlwdG9ycwoqIGFjY29yZGluZ2x5LgoqISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KKgoqLkRJQUdSQU0KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkRFU0NfU1RSQ1QqCmhjZl9kbWFfcnhfZ2V0IChJRkJQIGlmYnApCnsKREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CgoJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfUlggKTsKCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKCgkJCQkJCQkJCQkJLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgojaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJaWYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAogICAgewppbnQgaTsKREVTQ19TVFJDVCAqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsJLy9wb2ludGVyIHRvIDJuZCBkZXNjcmlwdG9yIG9mIGZyYW1lCgkJSENGQVNTRVJUKHAsIDApCgkJLy8gVGhlIDJuZCBkZXNjcmlwdG9yIGNvbnRhaW5zIChtYXliZSkgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCgkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCgkJaSA9ICood2NpX3JlY29yZHApJmRlc2NwLT5idWZfYWRkcltIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CgkJaWYgKCBpID09IEhGU19TVEFUX1RVTk5FTCB8fAoJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CgkJCS8vIFRoZSAybmQgZGVzY3JpcHRvciBjb250YWlucyBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KCQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID09IChwLT5idWZfYWRkcls1XSArIChwLT5idWZfYWRkcls0XTw8OCkgKyAyKjYgKyAyIC0gOCksIHAtPkJVRl9DTlQgKQoJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24KCQkJSENGQVNTRVJUKHAtPkJVRl9TSVpFID49OCwgcC0+QlVGX1NJWkUpCgkJCS8vIG1vdmUgU0FbMjo1XSBpbiB0aGUgc2Vjb25kIGJ1ZmZlciB0byByZXBsYWNlIHBhcnQgb2YgdGhlIFNOQVAgaGVhZGVyCgkJCWZvciAoIGk9MzsgaSA+PSAwOyBpLS0pIHAtPmJ1Zl9hZGRyW2krOF0gPSBwLT5idWZfYWRkcltpXTsKCQkJLy8gY29weSBEQVswOjVdLCBTQVswOjFdIGZyb20gZmlyc3QgYnVmZmVyIHRvIHNlY29uZCBidWZmZXIKCQkJZm9yICggaT0wOyBpPDg7IGkrKykgcC0+YnVmX2FkZHJbaV0gPSBkZXNjcC0+YnVmX2FkZHJbSEZTX0FERFJfREVTVCArIGldOwoJCQkvLyBtYWtlIGZpcnN0IGJ1ZmZlciBzaG9ydGVyIGluIGNvdW50CgkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX0FERFJfREVTVDsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfRU5DCglpZiAoIGRlc2NwID09IE5VTEwgKSBpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1JETUFEOyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVCApCglyZXR1cm4gZGVzY3A7Cn0gLy8gaGNmX2RtYV9yeF9nZXQKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCXZvaWQgaGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQoqLlBVUlBPU0UJCXN1cHBseSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgoqCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWRlc2NwCQlhZGRyZXNzIG9mIGEgRGVzY3JpcHRvckxpc3QKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCiogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0YWludHMgYXBwbHkgdG8gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9yIGFuZCB0aGUgYnVmZmVycyBhc3NvY2lhdGVkCiogd2l0aCB0aGUgZmlyc3QgMiBkZXNjcmlwdG9ycy4gSW5kZXBlbmRlbnQgb2YgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSwgdGhlIENPVU5UIGZpZWxkcyBhcmUgaWdub3JlZC4KKiBBIHNwZWNpYWwgY2FzZSBpcyB0aGUgc3VwcGx5aW5nIG9mIHRoZSBERUxXQSBkZXNjcmlwdG9yLCB3aGljaCBtdXN0IGJlIHN1cHBsaWVkIGFzIHRoZSBmaXJzdCBkZXNjcmlwdG9yLgoqCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCiogLSBpbiBjYXNlIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgZXhhY3Qgc2l6ZSBjb3JyZXNwb25kaW5nIHdpdGggdGhlIFJ4RlMgdXAgdG8gdGhlIDgwMi4zIERlc3RBZGRyCioJCWZpZWxkICg9PSAyOSB3b3JkcykuCioJICAtCVRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIG1pbmltdW0gc2l6ZSBvZiA4IGJ5dGVzLgoqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAoqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQoqIC0gRE1BIGlzIG5vdCBlbmFibGVkCiogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAoqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCiogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAoqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCioKKi5ESUFHUkFNCioKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCnsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9SWF9QVVQsIDB4REEwMSApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCgoJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9SWCApOwojaWYgSENGX0FTU0VSVCAmJiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCglpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA9PSBIQ0ZfRE1BX1JYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICkKCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApIC8vIGZpcnN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvcgoJCS8vIFRoZSBzZWNvbmQgREIgaXMgZm9yIFNOQVAgYW5kIHBheWxvYWQgcHVycG9zZXMuIEl0IHNob3VsZCBiZSBhIG1pbmltdW0gb2YgMTIgYnl0ZXMgaW4gc2l6ZS4KCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX1NJWkUgPj0gMTIsIGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX1NJWkUgKQoJfQojZW5kaWYgLy8gSENGQVNTRVJUIC8gSENGX0VOQwoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9SWF9QVVQgKQp9IC8vIGhjZl9kbWFfcnhfcHV0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQlERVNDX1NUUkNUKiBoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQlETUEgbW9kZTogcmVjbGFpbXMgYW5kIGRlY2Fwc3VsYXRlcyBwYWNrZXRzIGluIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluIGlmOgoqCQkJCSAtIEEgVHggcGFja2V0IGhhcyBiZWVuIGNvcGllZCBmcm9tIGhvc3QtUkFNIGludG8gTklDLVJBTSBieSB0aGUgRE1BIGVuZ2luZQoqCQkJCSAtIFRoZSBIZXJtZXMvRE1BZW5naW5lIGhhdmUgYmVlbiBkaXNhYmxlZAoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCioJcG9pbnRlciB0byBhIHJlY2xhaW1lZCBUeCBwYWNrZXQuCioKKi5ERVNDUklQVElPTgoqIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kOgoqIFdoZW4gYSBub24tZW1wdHkgcG9vbCBvZiBUeCBkZXNjcmlwdG9ycyBleGlzdHMgKGNyZWF0ZWQgYnkgbWVhbnMgb2YgaGNmX2RtYV9wdXRfdHgpLCB0aGUgTVNGCiogaXMgc3VwcG9zZWQgdG8gZW1wdHkgdGhhdCBwb29sIGJ5IG1lYW5zIG9mIGhjZl9kbWFfdHhfZ2V0IGNhbGxzIGFmdGVyIHRoZSBkaXNhYmxlIGluIGFuCiogZGlzYWJsZS9lbmFibGUgc2VxdWVuY2UuCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KREVTQ19TVFJDVCoKaGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCnsKREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CgoJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfVFggKTsKCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJaWYgKCAoIGRlc2NwLT5CVUZfQ05UID09IEhGU19UWVBFICkKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKCQkJIHx8ICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0RBVCApCiNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKCQkpIHsgLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uIGlmIG5lZWRlZAoJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgLT0gSENGX0RBU0FfU0laRTsKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UIAkJICs9IEhDRl9EQVNBX1NJWkU7CgkJfQojZW5kaWYgLy8gSENGX0VOQwoJaWYgKCBkZXNjcCA9PSBOVUxMICkgeyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0CgkJaWZicC0+SUZCX0RtYVBhY2tldHMgJj0gKGhjZl8xNil+SFJFR19FVl9URE1BRDsKCX0KCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfR0VUICkKCXJldHVybiBkZXNjcDsKfSAvLyBoY2ZfZG1hX3R4X2dldAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJdm9pZCBoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQoqLlBVUlBPU0UJCXB1dHMgYSBwYWNrZXQgaW4gdGhlIFR4IERNQSBxdWV1ZSBpbiBob3N0IHJhbSBhbmQga2lja3Mgb2ZmIHRoZSBUeERtYSBlbmdpbmUuCioJCQkJc3VwcGx5IHRoZSBUeC1ERUxXQSBkZXNjcmlwdG9yLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJZGVzY3AJCWFkZHJlc3Mgb2YgVHggRGVzY3JpcHRvciBDaGFpbiAoaS5lLiBhIHNpbmdsZSBUeCBmcmFtZSkKKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCiogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCioKKiBSZWdhcmRsZXNzIG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LCB0aGUgZGVzY3JpcHRvciBsaXN0IGNyZWF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZyYW1lIHRvIGJlCiogdHJhbnNtaXR0ZWQsIG11c3Qgc3VwcGx5IHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIsIHByZWNlZGluZyB0aGUgYWN0dWFsIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgoqIEJhc2ljYWxseSwgdGhpcyBvbmx5IHN1cHBsaWVzIHdvcmtpbmcgc3RvcmFnZSB0byB0aGUgSENGIHdoaWNoIHBhc3NlcyB0aGlzIG9uIHRvIHRoZSBETUEgZW5naW5lLgoqIEFzIGEgY29uc2VxdWVuY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3BhY2UgZG8gbm90IG1hdHRlci4KKiBOZXZlcnRoZWxlc3MgQlVGX0NOVCBtdXN0IHRha2UgaW4gYWNjb3VudCB0aGlzIHN0b3JhZ2UuCiogVGhpcyB3b3JraW5nIHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIgbWF5IG5vdCBiZSBmcmFnbWVudGVkLCB0aGUgZmlyc3QgYnVmZmVyIG11c3QgYmUKKiBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gY29udGFpbiBhdCBsZWFzdCB0aGUgODAyLjExIGhlYWRlciwgaS5lLiBIRlNfQUREUl9ERVNUICgyOSB3b3JkcyBvciAweDNBIGJ5dGVzKS4KKiBUaGlzIHdheSwgdGhlIEhDRiBjYW4gc2ltcGx5LCByZWdhcmRsZXNzIHdoZXRoZXIgb3Igbm90IHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgd3JpdGUgdGhlIHBhcmFtZXRlcgoqIHR4X2NudGwgYXQgb2Zmc2V0IDB4MzYgKEhGU19UWF9DTlRMKSBpbiB0aGUgZmlyc3QgYnVmZmVyLgoqIE5vdGUgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgcGFydCBvciBhbGwgb2YgdGhlIGFjdHVhbCBmcmFtZSByZXByZXNlbnRlZCBieSB0aGUgZmlyc3QgZGVzY3JpcHRvciBhcyBsb25nCiogYXMgdGhlIHJlcXVpcmVtZW50IGZvciBzdG9yYWdlIGZvciB0aGUgODAyLjExIGhlYWRlciBpcyBtZXQsIGkuZS4gdGhlIDgwMi4zIGZyYW1lIHN0YXJ0cyBhdCBvZmZzZXQKKiBIRlNfQUREUl9ERVNULgoqIEV4Y2VwdCBmb3IgdGhlIEFzc2VydCBvbiB0aGUgMXN0IGJ1ZmZlciBpbiBjYXNlIG9mIEVuY2Fwc3VhbHRpb24sIHRoZSBTSVpFIGZpZWxkcyBhcmUgaWdub3JlZC4KKgoqIEluIGNhc2UgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSBpcyBjb21waWxlZCBpbiwgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCByZXF1aXJlbWVudHMuCiogbyBUaGUgQlVGX0NOVCBvZiB0aGUgZmlyc3QgYnVmZmVyIGNoYW5nZXMgZnJvbSBhIG1pbmltdW0gb2YgMHgzQSBieXRlcyB0byBleGFjdGx5IDB4M0EsIGkuZS4gdGhlIHdvcmtzcGFjZQoqCXRvIHN0b3JlIHRoZSA4MDIuMTEgaGVhZGVyCiogbyBUaGUgQlVGX1NJWkUgb2YgdGhlIGZpcnN0IGJ1ZmZlciBpcyBhdCBsZWFzdCB0aGUgc3BhY2UgbmVlZGVkIHRvIHN0b3JlIHRoZQoqCS0gODAyLjExIGhlYWRlciAoMjkgd29yZHMpCioJLSA4MDIuMyBoZWFkZXIsIGkuZS4gMTIgYnl0ZXMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgMiBieXRlcyBsZW5ndGggZmllbGQKKgktIDYgYnl0ZXMgU05BUC1oZWFkZXIKKiAgIFRoaXMgcmVzdWx0cyBpbiAzOSB3b3JkcyBvciAweDRFIGJ5dGVzIG9yIEhGU19UWVBFLgoqICAgTm90ZSB0aGF0IGlmIHRoZSBCVUZfU0laRSBpcyBsYXJnZXIgdGhhbiAweDRFLCB0aGlzIHN1cnBsdXMgaXMgbm90IHVzZWQuCiogbyBUaGUgYWN0dWFsIGZyYW1lIGJlZ2lucyBpbiB0aGUgMm5kIGRlc2NyaXB0b3IgKHdoaWNoIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgQlVGX0NOVCA9PSAweDNBIHJlcXVpcmVtZW50KSBhbmQgdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSA4MDIuMyBoZWFkZXIsIGkuZS4gdGhlIDE0IGJ5dGVzIHJlcHJlc2VudGluZyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCBsZW5ndGgvdHlwZSBmaWVsZAoqCiogICBXaGVuIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkIDw9IDE1MDApLCAgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byBkZXNjcmlwdG9ycwoqICAgb3IgYnVmZmVycy4KKgoqICAgV2hlbiB0aGUgSENGIGFjdHVhbGx5IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA+IDE1MDApLCBpdCBzdWNjZXNzaXZlbHkgd3JpdGVzLCBzdGFydGluZyBhdAoqICAgb2Zmc2V0IEhGU19BRERSX0RFU1QgKDB4M0EpIGluIHRoZSBmaXJzdCBidWZmZXI6CiogICAgIC0gdGhlIDgwMi4zIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24sIGNvcGllZCBmcm9tIHRoZSBiZWdpbiBvZiB0aGUgc2Vjb25kIGJ1ZmZlcgoqICAgICAtIHRoZSBmcmFtZSBsZW5ndGgsIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYWdtZW50cywgY29ycmVjdGVkIGZvciB0aGUgU05BUAoqICAgCWhlYWRlciBsZW5ndGggYW5kIFR5cGUgZmllbGQgYW5kIGlnbm9yaW5nIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgTGVuZ3RoIGZpZWxkCiogCSAgLSB0aGUgYXBwcm9wcmlhdGUgc25hcCBoZWFkZXIgKFR1bm5lbCBvciAxMDQyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZpZWxkKS4KKgoqIAkgVGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaXJzdCB0d28gZGVzY3JpcHRvcnMgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHk6CiogCSAgLSB0aGUgZmlyc3QgZGVzY3JpcHRvciBjb3VudCBpcyBjaGFuZ2VkIGZyb20gMHgzQSB0byAweDRFIChIRlNfVFlQRSksIHdoaWNoIG1hdGNoZXMgMHgzQSArIDEyICsgMiArIDYKKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBjb3VudCBpcyBkZWNyZWFzZWQgYnkgMTIsIGJlaW5nIHRoZSBtb3ZlZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCiogCSAgLSB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgKHBoeXNpY2FsKSBidWZmZXIgYWRkcmVzcyBpcyBpbmNyZWFzZWQgYnkgMTIuCioKKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCiogdW5kb25lLgoqCiogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycwoqIEluIGNhc2Ugb2YgZW5jYXBzdWxhdGlvbiwgQlVGX1NJWkUgb2YgdGhlIDFzdCBkZXNjcmlwdG9yIGlzIGFzc2VydGVkIHRvIGJlIGF0IGxlYXN0IEhGU19UWVBFICgweDRFKSwgc28gaXQgaXMgTk9UIHRlc3RlZC4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gdHhfY250bCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgoqIC0gaW4gY2FzZSBlbmNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YgaXMgc2VsZWN0ZWQ6CioJICAtCVRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHRoZSAoc3BhY2UgZm9yKSB0aGUgODAyLjExIGhlYWRlciAoPT0gMjggd29yZHMpCioJICAtCVRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgYSBzaXplIHRvIGFkZGl0aW9uYWxseSBhY2NvbW9kYXRlIHRoZSA4MDIuMyBoZWFkZXIgYW5kIHRoZQoqCQlTTkFQIGhlYWRlciBvZiB0aGUgZnJhbWUgYWZ0ZXIgZW5jYXBzdWxhdGlvbiAoPT0gMzkgd29yZHMpLgoqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBhdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlL2xlbmd0aCcgKD09MTQgYnl0ZXMgb3IgNyB3b3JkcykKKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKiAtIERNQSBpcyBub3QgZW5hYmxlZAoqIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgoqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCiogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQoqLkRJQUdSQU0KKgoqLk5PVElDRQoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKgoqMToJV3JpdGUgdHhfY250bCBwYXJhbWV0ZXIgdG8gSEZTX1RYX0NOVEwgZmllbGQgaW50byB0aGUgSGVybWVzLXNwZWNpZmljIGhlYWRlciBpbiBidWZmZXIgMQoqNDoJZGV0ZXJtaW5lIHdoZXRoZXIgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQgYW5kIHdyaXRlIHRoZSB0eXBlICh0dW5uZWwgb3IgMTA0MikgYWxyZWFkeSBhdCB0aGUgYXBwcm9wcmlhdGUKKglvZmZzZXQgaW4gdGhlIDFzdCBidWZmZXIKKjY6CUJ1aWxkIHRoZSBlbmNhcHN1YWx0aW9uIGVudmVsb3BwZSBpbiB0aGUgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSAxc3QgYnVmZmVyCioJLSBDb3B5IERBL1NBIGZpZWxkcyBmcm9tIHRoZSAybmQgYnVmZmVyCiogICAtIENhbGN1bGF0ZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKHNuYXAtaGVhZGVyICsgdHlwZS1maWVsZCArIHRoZSBsZW5ndGggb2YgYWxsIGJ1ZmZlciBmcmFnbWVudHMKKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAoqICAgICBTb3VyY2VBZGRyZXNzIGFuZCBsZW5naHQtZmllbGQpCiogICAgIEFzc2VydCB0aGUgbWVzc2FnZSBsZW5ndGgKKgkgIFdyaXRlIGxlbmd0aC4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGluIEJFIGZvcm1hdCwgaGVuY2Ugb24gTEUgcGxhdGZvcm1zIHRoZSBsZW5ndGggbXVzdCBiZSBjb252ZXJ0ZWQKKgkgIDs/IFRISVMgSVMgTk9UIFdIQVQgQ1VSUkVOVExZIElTIElNUExFTUVOVEVECioJLSBXcml0ZSBzbmFwIGhlYWRlci4gTm90ZSB0aGF0IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHNuYXAgaGVhZGVyIGlzIE5PVCBjb3BpZWQsIHRoYXQgYnl0ZSBpcyBhbHJlYWR5IGluCioJICBwbGFjZSBhcyByZXN1bHQgb2YgdGhlIGNhbGwgdG8gaGNmX2VuY2FwLgoqCU5vdGUgdGhhdCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIHNraW4gYSBjYXQuIFRvIGV4cHJlc3MgdGhlIG9mZnNldHMgaW4gdGhlIDFzdCBidWZmZXIgd2hpbGUgd3JpdGluZwoqCXRoZSBzbmFwIGhlYWRlciwgSEZTX1RZUEUgaXMgY2hvb3NlbiBhcyBhIHJlZmVyZW5jZSBwb2ludCB0byBtYWtlIGl0IGVhc2llciB0byBncmFzcCB0aGF0IHRoZSBzbmFwIGhlYWRlcgoqCWFuZCBlbmNhcHN1YWx0aW9uIHR5cGUgYXJlIGF0IGxlYXN0IHJlbGF0aXZlIGluIHRoZSByaWdodC4KKjg6CW1vZGlmeSAxc3QgZGVzY3JpcHRvciB0byByZWZsZWN0IG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciArIFNuYXAtaGVhZGVyCioJbW9kaWZ5IDJuZCBkZXNjcmlwdG9yIHRvIHNraXAgdGhlIG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciAoREEvU0EKKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KKglTZXQgU09QIGJpdCBvbiBmaXJzdCBkZXNjcmlwdG9yLiBTZXQgRU9QIGJpdCBvbiBsYXN0IGRlc2NyaXB0b3IuCioxMjogRWl0aGVyIGFwcGVuZCB0aGUgY3VycmVudCBmcmFtZSB0byBhbiBleGlzdGluZyBkZXNjcmlwdG9yIGxpc3Qgb3IKKjE0OiBjcmVhdGUgYSBsaXN0IGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCioxNjogcmVtZW1iZXIgdGhlIG5ldyBlbmQgb2YgdGhlIGxpc3QKKjIwOiBoYW5kIHRoZSBmcmFtZSBvdmVyIHRvIHRoZSBETUEgZW5naW5lCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApoY2ZfZG1hX3R4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQp7CkRFU0NfU1RSQ1QJKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CmludAkJCWk7CgojaWYgSENGX0FTU0VSVAoJaW50IHggPSBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgPyB0eF9jbnRsICYgfkhGU19UWF9DTlRMX1BPUlQgOiB0eF9jbnRsOwoJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9UWF9QVVQsIDB4REEwMyApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCglIQ0ZBU1NFUlQoICggaWZicC0+SUZCX0NudGxPcHQgJiAoVVNFX0RNQXxETUFfRU5BQkxFRCkgKSA9PSAoVVNFX0RNQXxETUFfRU5BQkxFRCksIGlmYnAtPklGQl9DbnRsT3B0KQoKCWlmICggZGVzY3AtPmJ1Zl9hZGRyICkgewoJCSooaGNmXzE2KikoZGVzY3AtPmJ1Zl9hZGRyICsgSEZTX1RYX0NOVEwpID0gdHhfY250bDsJCQkJCQkJCQkJCS8qMSovCiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIsIDAgKQkJCQkJCQkJCS8vYXQgbGVhc3QgMiBkZXNjcmlwb3JzCgkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfQUREUl9ERVNULCBkZXNjcC0+QlVGX0NOVCApCS8vZXhhY3QgbGVuZ3RoIHJlcXVpcmVkIGZvciAxc3QgYnVmZmVyCgkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPj0gSENGX0RNQV9UWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCS8vbWluaW1hbCBzdG9yYWdlIGZvciBlbmNhcHN1bGF0aW9uCgkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICk7CQkJCQkvL2F0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUnIGluIDJuZCBidWZmZXIKCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCgkJLyogaWYgd2UgYXJlIGRvaW5nIFBQSyArLy0gQ01JQywgb3Igd2UgYXJlIHNlbmRpbmcgYSBERFAgZnJhbWUgKi8KCQlpZiAoICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKCQkJICggKCBwLT5CVUZfQ05UID49IDIwICkJCSAmJiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxMl0gPT0gMHhBQSApICYmICggcC0+YnVmX2FkZHJbMTNdID09IDB4QUEgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxNF0gPT0gMHgwMyApICYmICggcC0+YnVmX2FkZHJbMTVdID09IDB4MDAgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxNl0gPT0gMHg0MCApICYmICggcC0+YnVmX2FkZHJbMTddID09IDB4OTYgKSAmJgoJCQkgKCBwLT5idWZfYWRkclsxOF0gPT0gMHgwMCApICYmICggcC0+YnVmX2FkZHJbMTldID09IDB4MDAgKSkpCgkJewoJCQkvKiBjb3B5IHRoZSBEQS9TQSB0byB0aGUgZmlyc3QgYnVmZmVyICovCgkJCWZvciAoIGkgPSAwOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewoJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IHAtPmJ1Zl9hZGRyW2ldOwoJCQl9CgkJCS8qIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQgZnJhZ21lbnQgb25seSAqLwoJCQlpID0gMDsKCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApOwoJCQlpIC09IEhDRl9EQVNBX1NJWkUgOwoJCQkvKiBjb252ZXJ0IHRoZSBsZW5ndGggZmllbGQgdG8gYmlnIGVuZGlhbiwgdXNpbmcgdGhlIGVuZGlhbiBmcmllbmRseSBtYWNyb3MgKi8KCQkJaSA9IENOVl9TSE9SVF9UT19CSUcoaSk7CQkvLyEhIHRoaXMgY29udmVydHMgT05MWSBvbiBMRSBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBub24tQ0NYIGNvZGUKCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IChoY2ZfMTYpaTsKCQkJZGVzY3AtPkJVRl9DTlQgPSBIRlNfREFUOwoJCQkvLyBtb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgJ0RhL1NhJyBmaWVsZHMKCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyICs9IEhDRl9EQVNBX1NJWkU7CgkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVAkJIC09IEhDRl9EQVNBX1NJWkU7CgkJfQoJCWVsc2UKI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCXsKCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdID0gaGNmX2VuY2FwKCZkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdKTsJCS8qNCovCgkJCWlmICggZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdICE9IEVOQ19OT05FICkgewoJCQkJZm9yICggaT0wOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewkJCQkJCQkJCQkJCQkJLyo2Ki8KCQkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltpXTsKCQkJCX0KCQkJCWkgPSBzaXplb2Yoc25hcF9oZWFkZXIpICsgMiAtICggMio2ICsgMiApOwoJCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKCQkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSBDTlZfRU5EX1NIT1JUKGkpOwkvLyEhIHRoaXMgY29udmVydHMgb24gQUxMIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIENDWCBjb2RlCgkJCQlmb3IgKCBpPTA7IGkgPCBzaXplb2Yoc25hcF9oZWFkZXIpIC0gMTsgaSsrKSB7CgkJCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFIC0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIGldID0gc25hcF9oZWFkZXJbaV07CgkJCQl9CgkJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19UWVBFOwkJCQkJCQkJCQkJCQkJCQkJLyo4Ki8KCQkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkcgkrPSBIQ0ZfREFTQV9TSVpFOwoJCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkJLT0gSENGX0RBU0FfU0laRTsKCQkJfQoJCX0KI2VuZGlmIC8vIEhDRl9FTkMKICAgIH0KCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGRlc2NwLCBETUFfVFggKTsKCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfUFVUICkKfSAvLyBoY2ZfZG1hX3R4X3B1dAoKI2VuZGlmIC8vIEhDRl9ETUEKCiNpZiAoSENGX0RMX09OTFkpID09IDAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouTU9EVUxFCQloY2ZfOCBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQoqLlBVUlBPU0UJCXRlc3Qgd2hldGhlciBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCioKKi5BUkdVTUVOVFMKKgl0eXBlCQkoRmFyKSBwb2ludGVyIHRvIHRoZSAoQmlnIEVuZGlhbikgVHlwZS9MZW5ndGggZmllbGQgaW4gdGhlIG1lc3NhZ2UKKgoqLlJFVFVSTlMKKglFTkNfTk9ORQkJbGVuL3R5cGUgaXMgImxlbiIgKCAoQklHX0VORElBTil0eXBlIDw9IDE1MDAgKQoqCUVOQ19UVU5ORUwJCWxlbi90eXBlIGlzICJ0eXBlIiBhbmQgMHg4MEYzIG9yIDB4ODEzNwoqCUVOQ18xMDQyCQlsZW4vdHlwZSBpcyAidHlwZSIgYnV0IG5vdCAweDgwRjMgb3IgMHg4MTM3CioKKi5DT05ESVRJT05TCioJTklDIEludGVycnVwdHMJZC5jCioKKi5ERVNDUklQVElPTgoqIFR5cGUgbXVzdCBwb2ludCB0byB0aGUgTGVuL1R5cGUgZmllbGQgb2YgdGhlIG1lc3NhZ2UsIHRoaXMgaXMgdGhlIDItYnl0ZSBmaWVsZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgNiBieXRlCiogRGVzdGluYXRpb24gQWRkcmVzcyBhbmQgNiBieXRlIFNvdXJjZSBBZGRyZXNzLiAgVGhlIDIgc3VjY2Vzc2l2ZSBieXRlcyBhZGRyZXNzZWQgYnkgdHlwZSBhcmUgaW50ZXJwcmV0ZWQgYXMKKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCiogZm9ybWF0LiAgT3RoZXJ3aXNlIHRoZSBtZXNzYWdlIGlzIGFzc3VtZWQgdG8gYmUgaW4gRXRoZXJuZXQtSUkgZm9ybWF0LiAgRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBMZW4vVHlwLAoqIEJyaWRnZSBUdW5uZWwgb3IgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKgoqLkRJQUdSQU0KKgoqICAxOglwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCiogIDI6CWNvbnZlcnQgdHlwZSBmcm9tICJuZXR3b3JrIiBFbmRpYW4gZm9ybWF0IHRvIG5hdGl2ZSBFbmRpYW4KKiAgNDoJdGhlIGxpdG11cyB0ZXN0IHRvIGRpc3Rpbmd1aXNoIHR5cGUgYW5kIGxlbi4KKglUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKKglub3QgcmVsYXRlZCBhdCBhbGwgdG8gdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgIGJ5IHRoZSBIZXJtZXMuCiogIDY6CWNoZWNrIHR5cGUgYWdhaW5zdDoKKgkJMHg4MEYzCS8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKKgkJMHg4MTM3CS8vSVBYCioJdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGVuY2Fwc3VsYXRpb24KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIEhDRl9FTkNBUAkvL2kuZSBIQ0ZfRU5DIG9yIEhDRl9FTkNfU1VQCiNpZiAhICggKEhDRl9FTkNBUCkgJiBIQ0ZfRU5DX1NVUCApCkhDRl9TVEFUSUMKI2VuZGlmIC8vIEhDRl9FTkNBUApoY2ZfOApoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQp7CgpoY2ZfOAlyYyA9IEVOQ19OT05FOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KaGNmXzE2CXQgPSAoaGNmXzE2KSgqdHlwZTw8OCkgKyAqKHR5cGUrMSk7CQkJCQkJCQkJCQkJCQkJCS8qIDIgKi8KCglpZiAoIHQgPiAxNTAwICkgewkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDQgKi8KCQlpZiAoIHQgPT0gMHg4MTM3IHx8IHQgPT0gMHg4MEYzICkgewoJCQlyYyA9IEVOQ19UVU5ORUw7CQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KCQl9IGVsc2UgewoJCQlyYyA9IEVOQ18xMDQyOwoJCX0KCX0KCXJldHVybiByYzsKfSAvLyBoY2ZfZW5jYXAKI2VuZGlmIC8vIEhDRl9FTkNBUAojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5NT0RVTEUJCWludCBoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKi5QVVJQT1NFCQlPYnRhaW5zIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIENhcmQgYW5kIGZyb20gdGhlIEhDRi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWx0dnAJCWFkZHJlc3Mgb2YgTGVuZ3RoVHlwZVZhbHVlIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAid2hhdCIgYW5kIHRoZSAiaG93IG11Y2giIG9mIHRoZQoqCQkJCWluZm9ybWF0aW9uIHRvIGJlIGNvbGxlY3RlZCBmcm9tIHRoZSBIQ0Ygb3IgZnJvbSB0aGUgSGVybWVzCioKKi5SRVRVUk5TCioJSENGX0VSUl9MRU4JCQlUaGUgcHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwKKglIQ0ZfU1VDQ0VTUwkJCVN1Y2Nlc3MKKiEhCXZpYSBjbWRfZXhlICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCioJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyByZXRyaWV2YWwKKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEhlcm1lcyBldmVudCBkaWQgbm90IG9jY3VyZSBpbiBleHBlY3RlZCB0aW1lCiohIQl2aWEgY21kX2V4ZSBhbmQgc2V0dXBfYmFwICh0eXBlID49IENGR19SSURfRldfTUlOICkKKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCUhDRiBpcyBpbiBkZWZ1bmN0IG1vZGUgKGJpdHMgMHg3RiByZWZsZWN0IGNhdXNlKQoqCiouREVTQ1JJUFRJT04KKiBUaGUgVC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBSSUQgd2FudGVkLiBUaGUgUklECiogaW5mb3JtYXRpb24gaWRlbnRpZmllZCBieSB0aGUgVC1maWVsZCBpcyBjb3BpZWQgaW50byB0aGUgVi1maWVsZC4KKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKKiBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZCBpdHNlbGYuCiogT24gcmV0dXJuLCB0aGUgTC1maWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB3b3JkcyBhY3R1YWxseSBjb250YWluZWQgYnkgdGhlIFR5cGUgYW5kIFZhbHVlIGZpZWxkcy4KKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCiogVi1maWVsZCBjYW4gY29udGFpbiBhdCBtb3N0ICJJbml0aWFsIERhdGFMZW5ndGgiIC0gMSB3b3JkcyBvZiBkYXRhLgoqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZSBjb21wbGV0ZSBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiB3b3JkcyBpbmRpY2F0ZWQgYnkgdGhlCiogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCiogSW5mb3JtYXRpb24gYmxvY2tzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudCBGL1cgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0CiogbW9yZSB0YWxsaWVzIHRoYW4gZWFybGllciB2ZXJzaW9ucy4KKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKKiBhcyBmaXRzIGlzIGNvcGllZCwgYW5kIGFuIGVycm9yIHN0YXR1cyBvZiBIQ0ZfRVJSX0xFTiBpcyByZXR1cm5lZC4KKgoqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQoqIE5JQyBpcyBhYnNlbnQuIFRoZSBNU0YgY2Fubm90LCBob3dldmVyLCB0aW1lbHkgZGV0ZWN0IGEgQ2FyZCByZW1vdmFsIGlmIHRoZSBDYXJkIGlzIHJlbW92ZWQgd2hpbGUKKiBoY2ZfZ2V0X2luZm8gaXMgaW4gcHJvZ3Jlc3MuICBUaGVyZWZvcmUsIHRoZSBIQ0YgcGVyZm9ybXMgaXRzIG93biBjaGVjayBvbiBDYXJkIHByZXNlbmNlIGFmdGVyIHRoZSByZWFkCiogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAoqIEhDRl9FUlJfTk9fTklDIGlzIHJldHVybmVkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgRGF0YSBCdWZmZXIgaXMgdW5wcmVkaWN0YWJsZS4gVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkCiogaW4gY2FzZSBvZiB0aGUgIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHMgbGlrZSBDRkdfVEFMTElFUy4KKgoqIEFzc2VydCBmYWlscyBpZgoqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyAwIG9yIDEgb3IgaGFzIGFuIGV4Y2Vzc2l2ZSB2YWx1ZSAoaS5lLiBleGNlZWRzIEhDRl9NQVhfTFRWKS4KKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KKgoqLkRJQUdSQU0KKglIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcwoqCWxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgTWFpbEJveCBJbmZvIGJsb2NrLCBvbmx5IGFzIG11Y2ggYXMgZml0cyBpbiB0aGUgUEMgUkFNIGJ1ZmZlciBpcyBjb3BpZWQuIEFmdGVyCioJdGhlIGNvcHlpbmcgdGhlIE1haWxCb3ggUmVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgTWFpbEJveCBJbmZvIGJsb2NrLCBoZW5jZSB0aGUKKglyZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCioJcmVmbGVjdGVkIGluIHRoZSByZXR1cm4gc3RhdHVzLiBOb3RlIHRoYXQgaGNmX2dldF9pbmZvIGd1YXJhbnRlZXMgdGhlIGxlbmd0aCBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBtZWV0cwoqCXRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiBhdCBsZWFzdCAyLCBzbyBubyBQQyBSQU0gYnVmZmVyIG92ZXJydW4uCioKKglDYWxsaW5nIGhjZl9nZXRfbWJfaW5mbyB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggSW5mbyBibG9jayBhdmFpbGFibGUgb3Igd2hlbiB0aGVyZSBpcyBubyBNYWlsQm94IGF0IGFsbCwKKglyZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KKgoqMTI6CXNlZSBOT1RJQ0UKKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCioJb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCioyMDogIkhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkiIGlzIG5vdCBzdWl0YWJsZSBiZWNhdXNlIHRoaXMgd2lsbCBhbHdheXMgdHJpZ2dlciBhcyBzaWRlIGVmZmVjdCBvZgoqCXRoZSBIQ0ZBU1NFUlQgaW4gaGNmX3B1dF9pbmZvIHdoaWNoIGNhbGxzIGhjZl9nZXRfaW5mbyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIFJJRCBleGlzdHMgYXQgYWxsLgoKKi5OT1RJQ0UKKgoqCSJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgoqCUNGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCioJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSwgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSQoqCU5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKKgoqCVJlbWFya3M6IFRyYW5zZmVycyBvcGVyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlCioJQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCioJVGhlIGV4YWN0IGxheW91dCBvZiB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgYWN0aW9uIGNvZGUuIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZQoqCWNvbXBsZXRlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW5kaWNhdGVkIGJ5IGxlbiBpcyBjb3BpZWQuICBMZW4KKglhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKglIZXJtZXMgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0IG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuIEl0IGlzIGEgY29uc2Npb3VzCioJZGVjaXNpb24gdGhhdCB1bnVzZWQgcGFydHMgb2YgdGhlIFBDIFJBTSBidWZmZXIgYXJlIG5vdCBjbGVhcmVkLgoqCioJUmVtYXJrczogVGhlIG9ubHkgZXJyb3IgYWdhaW5zdCB3aGljaCBpcyBwcm90ZWN0ZWQgaXMgdGhlICJSZWFkIGVycm9yIiBhcyByZXN1bHQgb2YgQ2FyZCByZW1vdmFsLiBPbmx5IHRoZQoqCWxhc3QgaGNmX2lvX3N0cmluZyBuZWVkIHRvIGJlIHByb3RlY3RlZCBiZWNhdXNlIGlmIHRoZSBmaXJzdCBmYWlscyB0aGUgc2Vjb25kIHdpbGwgZmFpbCBhcyB3ZWxsLiBDaGVja2luZwoqCWZvciBjbWRfZXhlIGVycm9ycyBpcyBzdXBwb3NlZCBzdXBlcmZsdW91cyBiZWNhdXNlIHByb2JsZW1zIGluIGNtZF9leGUgYXJlIGFscmVhZHkgY2F1Z2h0IG9yIHdpbGwgYmUKKgljYXVnaHQgYnkgaGNmX2VuYWJsZS4KKgoqCUNGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCioKKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKgkgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKQlvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfVEFMTElFUykgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwoqCQlhcmUgdmFsaWQKKgkgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCioJCUxUViByZWNvcmQgd2l0aCBhIHplcm8gdmFsdWUgaW4gdGhlIEwtZmllbGQgZm9yIGFsbCBUeXAtY29kZXMgaXQgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIGlzCioJCWRlZmluZWQgYW5kIGludGVuZGVkIGJlaGF2aW9yLCBzbyBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoIG9uIHRoaXMgcGhlbm9tZW5hLgoqCSAgLQlhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCioKKi5DT05ESVRJT05TCiogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJbGVuID0gbHR2cC0+bGVuOwpoY2ZfMTYJCXR5cGUgPSBsdHZwLT50eXA7CndjaV9yZWNvcmRwCXAgPSAmbHR2cC0+bGVuOwkJLy9kZXN0aW5hdGlvbiB3b3JkIHBvaW50ZXIgKGluIExUViByZWNvcmQpCmhjZl8xNgkJKnEgPSBOVUxMOwkJCQkvKiBzb3VyY2Ugd29yZCBwb2ludGVyICBOb3RlISEgRE9TIENPTSBjYW4ndCBjb3BlIHdpdGggRkFSCgkJCQkJCQkJCSAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQoJCQkJCQkJCQkgKi8KaW50CQkJaTsKCglIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0dFVF9JTkZPLCBsdHZwLT50eXAgKQoJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQoJSENGQVNTRVJUX0lOVAoJSENGQVNTRVJUKCBsdHZwLCAwICkKCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBsdHZwLT50eXAsIGx0dnAtPmxlbiApICkKCglsdHZwLT5sZW4gPSAwOwkJCQkJCQkJLy9kZWZhdWx0IHRvOiBObyBJbmZvIEF2YWlsYWJsZQojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgLy9maWx0ZXIgb3V0IGFsbCBzcGVjaWFscwoJZm9yICggaSA9IDA7ICggcSA9IHh4eHhbaV0gKSAhPSBOVUxMICYmIHFbMV0gIT0gdHlwZTsgaSsrICkgLypOT1AqLzsKI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCiNpZiBIQ0ZfVEFMTElFUwoJaWYgKCB0eXBlID09IENGR19UQUxMSUVTICkgewkJCQkJCQkJCQkJCQkvKjMqLwoJCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfVEFMTElFUyApOwoJCXEgPSAoaGNmXzE2KikmaWZicC0+SUZCX1RhbGx5TGVuOwoJfQojZW5kaWYgLy8gSENGX1RBTExJRVMKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCWlmICggdHlwZSA9PSBDRkdfTUJfSU5GTyApIHsKCQlpZiAoIGlmYnAtPklGQl9NQkluZm9MZW4gKSB7CgkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewoJCQkJaWZicC0+SUZCX01CUnAgPSAwOyAvLzs/UHJvYmFibHkgc3VwZXJmbHVvdXMKCQkJfQoJCQlxID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwoJCQlpZmJwLT5JRkJfTUJScCArPSAqcSArIDE7CS8vdXBkYXRlIHJlYWQgcG9pbnRlcgoJCQlpZiAoIGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdID09IDB4RkZGRiApIHsKCQkJCWlmYnAtPklGQl9NQlJwID0gMDsKCQkJfQoJCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CgkJfQoJfQojZW5kaWYgLy8gSENGX0VYVF9NQgoJaWYgKCBxICE9IE5VTEwgKSB7CQkJCQkJLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KCQlpID0gbWluKCBsZW4sICpxICkgKyAxOwkJCQkvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQoJCXdoaWxlICggaS0tICkgewoJCQkqcCsrID0gKnE7CiNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKCQkJaWYgKCBxID4gJmlmYnAtPklGQl9UYWxseVR5cCAmJiB0eXBlID09IENGR19UQUxMSUVTICkgewoJCQkJKnEgPSAwOwoJCQl9CiNlbmRpZiAvLyBIQ0ZfVEFMTElFU19SRVNFVAoJCQlxKys7CgkJfQoJfSBlbHNlIHsJCQkJCQkJCS8vIG5vdCBhIHNwZWNpYWwgbm9yIENGR19UQUxMSUVTIG5vciBDRkdfTUJfSU5GTwoJCWlmICggdHlwZSA9PSBDRkdfQ05UTF9PUFQgKSB7CQkJCQkJCQkJCS8vcmVhZCBiYWNrIGVmZmVjdGl2ZSBvcHRpb25zCgkJCWx0dnAtPmxlbiA9IDI7CgkJCWx0dnAtPnZhbFswXSA9IGlmYnAtPklGQl9DbnRsT3B0OwojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9OSUNfQUNDRVNTCgkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfUFJPRF9EQVRBICkgeyAgLy9vbmx5IG5lZWRlZCBmb3Igc29tZSB0ZXN0IHRvb2wgb24gdG9wIG9mIEgtSUkgTkRJUyBkcml2ZXIKaGNmX2lvCQlpb19wb3J0Owp3Y2lfYnVmcAlwdDsJCQkJCS8vcG9pbnRlciB3aXRoIHRoZSAicmlnaHQiIHR5cGUsIGp1c3QgdG8gaGVscCBlYXNlIHdyaXRpbmcgbWFjcm9zIHdpdGggZW1iZWRkZWQgYXNzZW1ibHkKCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUICYgMHg3RSkgKTsKCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwkJLy90byBwcmV2ZW50IHNpZGUgZWZmZWN0cyBvZiB0aGUgTVNGLWRlZmluZWQgbWFjcm8KCQkJcCA9IGx0dnAtPnZhbDsJCQkJCS8vZGVzdGluYXRpb24gY2hhciBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQoJCQlpZiAoICggaSA9IGxlbiAtIDEgKSA+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+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKQp9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJaWYgKCBkZXNjcCApIGlmYnAtPklGQl9UeEZJRCA9IDA7CQkJCS8vY2FuY2VsIGEgcHJlLXB1dCBtZXNzYWdlCgojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9UWF9DT05UCQkJCS8vIENvbnRpbnVvdXMgdHJhbnNtaXQgdGVzdAoJaWYgKCB0eF9jbnRsID09IEhGU19UWF9DTlRMX1RYX0NPTlQgKSB7CgkgCWlmICggKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgewoJCQkJCQkJCQkJCS8vc2V0dXAgQkFQIHRvIGJlZ2luIG9mIFR4RlMKCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX09VVCApOwoJCQkJCQkJCQkJCS8vY29weSBhbGwgdGhlIGZyYWdtZW50cyBpbiBhIHRyYW5zcGFyZW50IGZhc2hpb24KCQkgCWZvciAoIHAgPSBkZXNjcDsgcDsgcCA9IHAtPm5leHRfZGVzY19hZGRyICkgewoJCQkvKiBvYm5veGlvdXMgd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyICovCgkJCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKCQkJCXB1dF9mcmFnKCBpZmJwLCBwLT5idWZfYWRkciwgcC0+QlVGX0NOVCBCRV9QQVIoMCkgKTsKCQkJfQoJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfVEhFU0VVUyB8IEhDTURfQlVTWSB8IEhDTURfU1RBUlRQUkVBTUJMRSwgZmlkICk7CgkJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgewoJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKCQkJfQoJCX0KCQkJCQkJCQkJCQkvLyBlZW4gc2xlY2h0IHZvb3JiZWVsZCBkb2V0IGdvZWQgdm9sZ2VuIDs/CgkJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFTkRfTVNHICkKCQlyZXR1cm4gcmM7Cgl9CiNlbmRpZiAvLyBIQ0ZfRVhUX1RYX0NPTlQKCQkJCQkJCQkJLyogdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBjb2RlIGlzIHJlZHVuZGFudCBmb3IgYSBwcmUtcHV0IG1lc3NhZ2UKCQkJCQkJCQkJICogYnV0IG1vdmluZyBpdCBpbnNpZGUgdGhlICJpZiBmaWQiIGxvZ2ljIG1ha2VzIHRoZSBtZXJnaW5nIHdpdGggdGhlCgkJCQkJCQkJCSAqIFVTQiBmbG93IGF3a3dhcmQKCQkJCQkJCQkJICovCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCgl0eF9jbnRsIHw9IGlmYnAtPklGQl9NSUNUeENudGw7CiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCWlmICggKGZpZCA9IGlmYnAtPklGQl9UeEZJRCkgPT0gMCAmJiAoIGZpZCA9IGdldF9maWQoIGlmYnAgKSApICE9IDAgKSAJCS8qIDQgKi8KCQkJLyogc2tpcCB0aGUgbmV4dCBjb21wb3VuZCBzdGF0ZW1lbnQgaWY6CgkJCSAgIC0gcHJlLXB1dCBtZXNzYWdlIG9yCgkJCSAgIC0gbm8gZmlkIGF2YWlsYWJsZSAod2hpY2ggc2hvdWxkIG5ldmVyIG9jY3VyIGlmIHRoZSBNU0YgYWRoZXJlcyB0byB0aGUgV0NJKQoJCQkgKi8KCXsJCS8vIHRvIG1hdGNoIHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgb2YgYWJvdmUgImlmIiBpbiBjYXNlIG9mIEhDRl9UWVBFX1VTQgoJCQkJCQkJCQkJCS8vY2FsY3VsYXRlIHRvdGFsIGxlbmd0aCA7PyBzdXBlcmZsdW91cyB1bmxlc3MgQ0NYIG9yIEVuY2Fwc3VsYXRpb24KCQlsZW4gPSAwOwoJCXAgPSBkZXNjcDsKCQlkbyBsZW4gKz0gcC0+QlVGX0NOVDsgd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKCQlwID0gZGVzY3A7Ci8vOz8JSENGQVNTRVJUKCBsZW4gPD0gSENGX01BWF9NU0csIGxlbiApCi8qNyovCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCBIRlNfVFhfQ05UTCwgSU9fT1VUICk7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfVFhfREVMQVkKCQlIQ0ZBU1NFUlQoICggZGVzY3AgIT0gTlVMTCApIF4gKCB0eF9jbnRsICYgSEZTX1RYX0NOVExfVFhfREVMQVkgKSwgdHhfY250bCApCgkJaWYgKCB0eF9jbnRsICYgSEZTX1RYX0NOVExfVFhfREVMQVkgKSB7CgkJCXR4X2NudGwgJj0gfkhGU19UWF9DTlRMX1RYX0RFTEFZOwkJLy8hIUhGU19UWF9DTlRMX1RYX0RFTEFZIG5vIGxvbmdlciBhdmFpbGFibGUKCQkJaWZicC0+SUZCX1R4RklEID0gZmlkOwoJCQlmaWQgPSAwOwkJCQkJCQkJLy8hIWZpZCBubyBsb25nZXIgYXZhaWxhYmxlLCBiZSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIGNvZGUKCQl9CiNlbmRpZiAvLyBIQ0ZfVFlQRV9UWF9ERUxBWQoJCU9QVyggSFJFR19EQVRBXzEsIHR4X2NudGwgKSA7CgkJT1BXKCBIUkVHX0RBVEFfMSwgMCApOwojaWYgISAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1ggKQoJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApCgkJCQkJCQkJCQkJLyogYXNzdW1lIERlc3RBZGRyL1NyY0FkZHIvTGVuL1R5cGUgQUxXQVlTIGNvbnRhaW5lZCBpbiAxc3QgZnJhZ21lbnQKCQkJCQkJCQkJCQkgKiBvdGhlcndpc2UgbGlmZSBnZXRzIHRvbyBjdW1iZXJzb21lIGZvciBNSUMgYW5kIEVuY2Fwc3VsYXRpb24gISEhISEhISEKCQlpZiAoIHAtPkJVRl9DTlQgPj0gMTQgKSB7CWFsdGVybmF0aXZlbHk6IGFkZCBhIHNhZmV0eSBlc2NhcGUgISEhISEhISEhISEhIH0JKi8KI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAoJCUNBTENfVFhfTUlDKCBOVUxMLCAtMSApOwkJLy9pbml0aWFsaXplIE1JQwovKjEwKi8JcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFIEJFX1BBUigwKSApOwkvL3dyaXRlIERBLCBTQSB3aXRoIE1JQyBjYWxjdWxhdGlvbgoJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkJLy9NSUMgb3ZlciBEQSwgU0EKCQlDQUxDX1RYX01JQyggbnVsbF9hZGRyLCA0ICk7CQkvL01JQyBvdmVyICh2aXJ0dWFsKSBwcmlvcml0eSBmaWVsZAojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAoJCS8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCgkJaWYoKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT04gKSB8fAogICAgICAgICAgICgoR0VUX0JVRl9DTlQocCkgPj0gMjAgKSAgICYmICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09GRiApICYmCiAgICAgICAgICAgIChwLT5idWZfYWRkclsxMl0gPT0gMHhBQSkgJiYgKHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBKSAmJgogICAgICAgICAgICAocC0+YnVmX2FkZHJbMTRdID09IDB4MDMpICYmIChwLT5idWZfYWRkclsxNV0gPT0gMHgwMCkgJiYKICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE2XSA9PSAweDQwKSAmJiAocC0+YnVmX2FkZHJbMTddID09IDB4OTYpICYmCiAgICAgICAgICAgIChwLT5idWZfYWRkclsxOF0gPT0gMHgwMCkgJiYgKHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwKSkpCiAgICAgICAgewogICAgICAgICAgICBpID0gSENGX0RBU0FfU0laRTsKCiAgICAgICAgICAgIE9QVyggSFJFR19EQVRBXzEsIENOVl9TSE9SVF9UT19CSUcoIGxlbiAtIGkgKSk7CgogICAgICAgICAgICAvKiBuZWVkIHRvIHNlbmQgb3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIGZyYWdtZW50ICovCgkJCXB1dF9mcmFnKCBpZmJwLCAmcC0+YnVmX2FkZHJbaV0sIEdFVF9CVUZfQ05UKHApIC0gaSBCRV9QQVIoMCkgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJewoJCQkJCQkJCQkJCS8vaWYgZW5jYXBzdWxhdGlvbiBuZWVkZWQKI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKCQkJCQkJCQkJCQkvL3dyaXRlIGxlbmd0aCAod2l0aCBTTkFQLWhlYWRlcixUeXBlLCB3aXRob3V0IC8vREEsU0EsTGVuZ3RoICkgbm8gTUlDIGNhbGMuCgkJCWlmICggKCBzbmFwX2hlYWRlcltzaXplb2Yoc25hcF9oZWFkZXIpLTFdID0gaGNmX2VuY2FwKCAmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKSApICE9IEVOQ19OT05FICkgewoJCQkJT1BXKCBIUkVHX0RBVEFfMSwgQ05WX0VORF9TSE9SVCggbGVuICsgKHNpemVvZihzbmFwX2hlYWRlcikgKyAyKSAtICggMio2ICsgMiApICkgKTsKCQkJCQkJCQkJCQkvL3dyaXRlIHNwbGljZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgoJCQkJcHV0X2ZyYWcoIGlmYnAsIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpIEJFX1BBUigwKSApOwoJCQkJQ0FMQ19UWF9NSUMoIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpICk7CS8vTUlDIG92ZXIgNiBieXRlIFNOQVAKCQkJCWkgPSBIQ0ZfREFTQV9TSVpFOwoJCQl9IGVsc2UKI2VuZGlmIC8vIEhDRl9FTkMKCQkJewoJCQkJT1BXKCBIUkVHX0RBVEFfMSwgKih3Y2lfcmVjb3JkcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKTsKCQkJCWkgPSAxNDsKCQkJfQoJCQkJCQkJCQkJCS8vY29tcGxldGUgMXN0IGZyYWdtZW50IHN0YXJ0aW5nIHdpdGggVHlwZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgoJCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSBCRV9QQVIoMCkgKTsKCQkJQ0FMQ19UWF9NSUMoICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgKTsKCQl9CgkJCQkJCQkJCQkJLy9kbyB0aGUgcmVtYWluaW5nIGZyYWdtZW50cyB3aXRoIE1JQyBjYWxjdWxhdGlvbgoJCXdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICkgewoJCQkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAoJCQkgKiBzbyBza2lwICovCgkJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQoJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CgkJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgcC0+QlVGX0NOVCApOwoJCX0KCQkJCQkJCQkJCQkvL3BhZCBtZXNzYWdlLCBmaW5hbGl6ZSBNSUMgY2FsY3VsYXRpb24gYW5kIHdyaXRlIE1JQyB0byBOSUMKCQlwdXRfZnJhZ19maW5hbGl6ZSggaWZicCApOwoJfQoJaWYgKCBmaWQgKSB7Ci8qMTYqLwlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQlVTWSB8IEhDTURfVFggfCBIQ01EX1JFQ0wsIGZpZCApOwoJCWlmYnAtPklGQl9UeEZJRCA9IDA7CgkJCS8qIHByb2JhYmx5IHRoaXMgKGkuZS4gbm8gUnNjSW5kIEFORCAiSFJFR19FVl9BTExPQyIpIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBvY2N1cnMgc28gaW5mcmVxdWVudCwKCQkJICogdGhhdCBpdCBtaWdodCBqdXN0IGFzIHdlbGwgYmUgYWNjZXB0YWJsZSB0byBza2lwIHRoaXMKCQkJICogIm9wdGltaXphdGlvbiIgY29kZSBhbmQgaGFuZGxlIHRoYXQgYWRkaXRpb25hbCBpbnRlcnJ1cHQgb25jZSBpbiBhIHdoaWxlCgkJCSAqLwovLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQovKjIwKi8JaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CgkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CgkJfQovLyAjZW5kaWYgLy8gQUxMT0NfMTUKCX0KLy8JSENGQVNTRVJUKCBsZXZlbDo6aWZicC0+SUZCX1JzY0luZCwgaWZicC0+SUZCX1JzY0luZCApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9zZW5kX21zZwojZW5kaWYgLy8gSENGX0RMX09OTFkKCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLk1PRFVMRQkJaW50IGhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKKi5QVVJQT1NFCQlTZXJ2aWNlcyAobW9zdCkgTklDIGV2ZW50cy4KKgkJCQlQcm92aWRlcyByZWNlaXZlZCBtZXNzYWdlCioJCQkJUHJvdmlkZXMgc3RhdHVzIGluZm9ybWF0aW9uLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCiogIEluIG5vbi1ETUEgbW9kZToKKglidWZwCQlhZGRyZXNzIG9mIGNoYXIgYnVmZmVyLCBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gaG9sZCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgUnhGUyB1cCB0aHJvdWdoIEhGU19UWVBFCioJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAoqCQkJCXZhbHVlIGJldHdlZW4gSEZTX1RZUEUgKyAyIGFuZCBIRlNfQUREUl9ERVNUICsgSENGX01BWF9NU0cKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwoqCUhDRl9FUlJfTUlDCW1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAob25seSBpZiBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gYnVmcCkKKgoqLkRFU0NSSVBUSU9OCioKKiBNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrCiogLSBJRkJfUnhMZW4JCQkwIG9yIEZyYW1lIHNpemUuCiogLSBJRkJfTUJJbmZvTGVuCQkwIG9yIHRoZSBMLWZpZWxkIG9mIHRoZSBvbGRlc3QgTUJJQi4KKiAtIElGQl9Sc2NJbmQKKiAtIElGQl9IQ0ZfVGFsbGllcwkJdXBkYXRlZCBpZiBhIGNvcnJlc3BvbmRpbmcgZXZlbnQgb2NjdXJyZWQuCiogLSBJRkJfTklDX1RhbGxpZXMJCXVwZGF0ZWQgaWYgYSBUYWxseSBJbmZvIGZyYW1lIHJlY2VpdmVkIGZyb20gdGhlIE5JQy4KKiAtIElGQl9EbWFQYWNrZXRzCiogLSBJRkJfVHhGc1N0YXQKKiAtIElGQl9UeEZzU3dTdXAKKiAtIElGQl9MaW5rU3RhdAkJcmVmbGVjdHMgbmV3IGxpbmsgc3RhdHVzIG9yIDB4MDAwMCBpZiBubyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCm9yCiogLSBJRkJfTGlua1N0YXQJCWxpbmsgc3RhdHVzLCAweDgwMDAgcmVmbGVjdHMgY2hhbmdlIHJlbGF0aXZlIHRvIHByZXZpb3VzIGhjZl9zZXJ2aWNlX25pYyBjYWxsLgoqCiogV2hlbiBJRkJfTUJJbmZvTGVuIGlzIG5vbi16ZXJvLCBhdCBsZWFzdCBvbmUgTUJJQiBpcyBhdmFpbGFibGUuCioKKiBJRkJfUnhMZW4JcmVmbGVjdHMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBpbiA4MDIuMyB2aWV3IChJbmNsdWRpbmcgRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbmd0aCwKKiBleGNsdWRpbmcgTUlDLXBhZGRpbmcsIE1JQyBhbmQgc3VtIGNoZWNrKSBvZiBhY3RpdmUgUnggRnJhbWUgU3RydWN0dXJlLiBJZiBubyBSeCBEYXRhIHMgYXZhaWxhYmxlLCBJRkJfUnhMZW4KKiBlcXVhbHMgMHgwMDAwLgoqIFJlcGVhdGVkIGV4ZWN1dGlvbiBjYXVzZXMgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgc3Vic2VxdWVudGx5IHJlY2VpdmVkCiogbWVzc2FnZXMsIGlycmVzcGVjdGl2ZSB3aGV0aGVyIGEgaGNmX3Jjdl9tc2cgb3IgaGNmX2FjdGlvbihIQ0ZfQUNUX1JYKSBpcyBwZXJmb3JtZWQgaW4gYmV0d2Vlbi4KKgoqIFdoZW4gSUZCX1J4TGVuIGlzIG5vbi16ZXJvLCBhIFJlY2VpdmVkIEZyYW1lIFN0cnVjdHVyZSBpcyBhdmFpbGFibGUgdG8gYmUgcm91dGVkIHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKiBXaGVuIE1vbml0b3IgTW9kZSBpcyBub3QgYWN0aXZlLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgYW4gZXJyb3ItZnJlZSBub24tV01QIGZyYW1lLgoqIEluIGNhc2Ugb2YgTW9uaXRvciBNb2RlLCBpdCBtYXkgYWxzbyBiZSBhIGZyYW1lIHdpdGggYW4gZXJyb3Igb3IgYSBXTVAgZnJhbWUuCiogRXJyb25lb3VzIGZyYW1lcyBoYXZlIGEgbm9uLXplcm8gZXJyb3Itc3ViIGZpZWxkIGluIHRoZSBIRlNfU1RBVCBmaWVsZCBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIuCioKKiBJZiBhIFJlY2VpdmUgbWVzc2FnZSBpcyBhdmFpbGFibGUgaW4gTklDIFJBTSwgdGhlIFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIGlzIChwYXJ0bHkpIGNvcGllZCBmcm9tIHRoZSBOSUMgdG8KKiB0aGUgYnVmZmVyIGlkZW50aWZpZWQgYnkgYnVmcC4KKiBDb3B5aW5nIHN0b3BzIGVpdGhlciBhZnRlciBsZW4gYnl0ZXMgb3Igd2hlbiB0aGUgY29tcGxldGUgODAyLjMgZnJhbWUgaXMgY29waWVkLgoqIER1cmluZyB0aGUgY29weWluZyB0aGUgbWVzc2FnZSBpcyBkZWNhcHN1bGF0ZWQgKGlmIGFwcHJvcHJpYXRlKS4KKiBJZiB0aGUgZnJhbWUgaXMgcmVhZCBjb21wbGV0ZWx5IGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgZnJhbWUgZml0cyBjb21wbGV0ZWx5IGluIHRoZSBsb29rYWhlYWQgYnVmZmVyKSwKKiB0aGUgZnJhbWUgaXMgYXV0b21hdGljYWxseSBBQ0snZWQgdG8gdGhlIEYvVyBhbmQgc3RpbGwgYXZhaWxhYmxlIHZpYSB0aGUgbG9vayBhaGVhZCBidWZmZXIgYW5kIGhjZl9yY3ZfbXNnLgoqIE9ubHkgaWYgdGhlIGZyYW1lIGlzIHJlYWQgY29tcGxldGVseSBieSBoY2Zfc2VydmljZV9uaWMsIGhjZl9zZXJ2aWNlX25pYyBjaGVja3MgdGhlIE1JQyBhbmQgc2V0cyB0aGUgcmV0dXJuCiogc3RhdHVzIGFjY29yZGluZ2x5LiAgSW4gdGhpcyBjYXNlLCBoY2ZfcmN2X21zZyBkb2VzIG5vdCBjaGVjayB0aGUgTUlDLgoqCiogVGhlIE1JQyBjYWxjdWxhdGlvbiBhbGdvcml0aG0gd29ya3MgbW9yZSBlZmZpY2llbnQgaWYgdGhlIGxlbmd0aCBvZiB0aGUgbG9vayBhaGVhZCBidWZmZXIgaXMKKiBzdWNoIHRoYXQgaXQgZml0cyBleGFjdGx5IDQgbiBieXRlcyBvZiB0aGUgODAyLjMgZnJhbWUsIGkuZS4gbGVuID09IEhGU19BRERSX0RFU1QgKyA0Km4uCioKKiBUaGUgU2VydmljZSBOSUMgRnVuY3Rpb24gc3VwcG9ydHMgdGhlIE5JQyBldmVudCBzZXJ2aWNlIGhhbmRsaW5nIHByb2Nlc3MuCiogSXQgcGVyZm9ybXMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbnMgdG8gc2VydmljZSB0aGUgTklDLCBzdWNoIHRoYXQgdGhlIGV2ZW50IGNhdXNlIGlzIGVsaW1pbmF0ZWQgYW5kIHJlbGF0ZWQKKiBpbmZvcm1hdGlvbiBpcyBzYXZlZC4KKiBUaGUgU2VydmljZSBOSUMgRnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgdGhlIE1TRiBJU1Igb3IgcG9sbGluZyByb3V0aW5lIGFzIGZpcnN0IHN0ZXAgdG8gZGV0ZXJtaW5lIHRoZSBldmVudAoqIGNhdXNlKHMpLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gcGVyZm9ybSBhbGwgbm90IGRpcmVjdGx5IE5JQyByZWxhdGVkIGludGVycnVwdCBzZXJ2aWNlCiogYWN0aW9ucywgZS5nLiBpbiBhIFBDIGVudmlyb25tZW50IHRoaXMgaW5jbHVkZXMgc2VydmljaW5nIHRoZSBQSUMsIGFuZCBtYW5hZ2luZyB0aGUgUHJvY2Vzc29yIEludGVycnVwdAoqIEVuYWJsaW5nL0Rpc2FibGluZy4KKiBJbiBjYXNlIG9mIGEgcG9sbGVkIGJhc2VkIHN5c3RlbSwgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgImZyZXF1ZW50bHkiLgoqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMgcmVsYXRlZCB0byB0aGUgTWFpbGJveCBhbmQgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKS4KKgoqIGhjZl9zZXJ2aWNlX25pYyByZXR1cm5zOgoqIC0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYXZhaWxhYmxlIE1CSUIgKElGQl9NQkluZm9MZW4pCiogLSBDaGFuZ2VzIGluIHRoZSBsaW5rIHN0YXR1cyAoSUZCX0xpbmtTdGF0KQoqIC0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYXZhaWxhYmxlIFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIChJRkJfUnhMZW4pCiogLSB1cGRhdGVkIElGQl9Sc2NJbmQKKiAtIFVwZGF0ZWQgVGFsbGllcwoqCiogaGNmX3NlcnZpY2VfbmljIGlzIHByZXN1bWVkIHRvIG5laXRoZXIgaW50ZXJydXB0IG90aGVyIEhDRi10YXNrcyBub3IgdG8gYmUgaW50ZXJydXB0ZWQgYnkgb3RoZXIgSENGLXRhc2tzLgoqIEEgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBwcmVjZWRlIGhjZl9zZXJ2aWNlX25pYyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBIQ0YtdGFza3Mgd2l0aCBhIGNhbGwgdG8KKiBoY2ZfYWN0aW9uIHRvIGRpc2FibGUgdGhlIGNhcmQgaW50ZXJydXB0cyBhbmQsIGFmdGVyIGFsbCB3b3JrIGlzIGNvbXBsZXRlZCwgd2l0aCBhIGNhbGwgdG8gaGNmX2FjdGlvbiB0bwoqIHJlc3RvcmUgKHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBlbmFibGluZykgdGhlIGNhcmQgaW50ZXJydXB0cy4KKiBJbiBjYXNlIG9mIGEgcG9sbGVkIGVudmlyb25tZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIE1TRiBwcm9ncmFtbWVyIGlzIHN1ZmZpY2llbnRseSBmYW1pbGlhciB3aXRoIHRoZQoqIHNwZWNpZmljIHJlcXVpcmVtZW50cyBvZiB0aGF0IGVudmlyb25tZW50IHRvIHRyYW5zbGF0ZSB0aGUgaW50ZXJydXB0IHN0cmF0ZWd5IHRvIGEgcG9sbGVkIHN0cmF0ZWd5LgoqCiogaGNmX3NlcnZpY2VfbmljIHNlcnZpY2VzIHRoZSBmb2xsb3dpbmcgSGVybWVzIGV2ZW50czoKKiAtIEhSRUdfRVZfSU5GTwkJQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uIEZyYW1lCiogLSBIUkVHX0VWX0lORk9fRFJPUAlXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQoqIC0gSFJFR19FVl9UWF9FWEMJCShpZiBhcHBsaWNhYmxlLCBpLmUuIHNlbGVjdGVkIHZpYSBIQ0ZfRVhUX0lOVF9UWF9FWCBiaXQgb2YgSENGX0VYVCkKKiAtIEhSRUdfRVZfU0xFRVBfUkVRCShpZiBhcHBsaWNhYmxlLCBpLmUuIHNlbGVjdGVkIHZpYSBIQ0ZfRERTL0hDRl9DRFMgYml0IG9mIEhDRl9TTEVFUCkKKiAqKiBpbiBub25fRE1BIG1vZGUKKiAtIEhSRUdfRVZfQUxMT0MJCUFzeW5jaHJvbm91cyBwYXJ0IG9mIEFsbG9jYXRpb24vUmVjbGFpbSBjb21wbGV0ZWQgd2hpbGUgb3V0IG9mIHJlc291cmNlcyBhdAoqIAkJCQkJCWNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnL25vdGlmeQoqIC0gSFJFR19FVl9SWAkJCXRoZSBkZXRlY3Rpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZiByZWNlaXZlZCBtZXNzYWdlcwoqIAkJCQkJCWluY2x1ZGluZyBXYXZlTEFOIE1hbmFnZW1lbnQgUHJvdG9jb2wgKFdNUCkgbWVzc2FnZSBwcm9jZXNzaW5nCiogKiogaW4gRE1BIG1vZGUKKiAtIEhSRUdfRVZfUkRNQUQKKiAtIEhSRUdfRVZfVERNQUQKKiEhIGhjZl9zZXJ2aWNlX25pYyBkb2VzIG5vdCBzZXJ2aWNlIHRoZSBmb2xsb3dpbmcgSGVybWVzIGV2ZW50czoKKiEhIAlIUkVHX0VWX1RYIAkJCSh0aGUgIk9LIiBUeCBFdmVudCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUgV0NJLCBpZiBpdCBvY2N1cnMgaXQgaXMgdW5jbGVhcgoqISEgCQkJCQkJd2hhdCB0aGUgY2F1c2UgaXMsIHNvIG5vIG1lYW5pbmdmdWwgc3RyYXRlZ3kgaXMgYXZhaWxhYmxlLiBOb3QgYWNraW5nIHRoZSBiaXQgaXMKKiEhIAkJCQkJCXByb2JhYmx5IHRoZSBiZXN0IGhlbHAgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gdGhlIGRlYnVnZ2VyLgoqISEgCUhSRUdfRVZfQ01ECQkJaGFuZGxlZCBpbiBjbWRfd2FpdC4KKiEhIAlIUkVHX0VWX0ZXX0RNQSAJCShpLmUuIEhSRUdfRVZfUlhETUEsIEhSRUdfRVZfVFhETUEgYW5kX0VWX0xQRVNDKSBhcmUgZWl0aGVyIG5vdCB1c2VkIG9yIHVzZWQKKiEhIAkJCQkJCWJldHdlZW4gdGhlIEYvVyBhbmQgdGhlIERNQSBlbmdpbmUuCiohISAJSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgSC1JSSAoaS5lLiBub3QgSElJLjUgYW5kIHVwLCBzZWUgREFXQSkKKgoqCUlmLCBpbiBub24tRE1BIG1vZGUsIGEgUnggbWVzc2FnZSBpcyBhdmFpbGFibGUsIGl0cyBsZW5ndGggaXMgcmVmbGVjdGVkIGJ5IHRoZSBJRkJfUnhMZW4gZmllbGQgb2YgdGhlIElGQi4KKglUaGlzIGxlbmd0aCByZWZsZWN0cyB0aGUgZGF0YSBpdHNlbGYgYW5kIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgRGF0YUxlbmd0aC9UeXBlIGZpZWxkCioJYnV0IG5vdCB0aGUgU05BUC1oZWFkZXIgaW4gY2FzZSBvZiBkZWNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YuICBJZiBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgSUZCX1J4TGVuIGlzCioJemVyby4gIEZvcm1lciB2ZXJzaW9ucyBvZiB0aGUgSENGIGhhbmRsZWQgV01QIG1lc3NhZ2VzIGFuZCBzdXBwb3J0ZWQgYSAibW9uaXRvciIgbW9kZSBpbiBoY2Zfc2VydmljZV9uaWMsCioJd2hpY2ggZGVwb3NpdGVkIGNlcnRhaW4gb3IgYWxsIFJ4IG1lc3NhZ2VzIGluIHRoZSBNYWlsQm94LiBUaGUgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIHRoZXNlIGZyYW1lcyBpcwoqCW1vdmVkIHRvIHRoZSBNU0YuIFRoZSBIQ0Ygb2ZmZXJzIGFzIHN1cHBvcnRzIGhjZl9wdXRfaW5mbyB3aXRoIENGR19NQl9JTkZPIGFzIHBhcmFtZXRlciB0byBlbXVsYXRlIHRoZSBvbGQKKiAJaW1wbGVtZW50YXRpb24gdW5kZXIgY29udHJvbCBvZiB0aGUgTVNGLgoqCiogKipSeCBCdWZmZXIgZnJlZSBzdHJhdGVneQoqCVdoZW4gaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5vbi1ETUEgbWVzc2FnZSwgdGhlIE1TRiBjYW4gYWNjZXNzIHRoYXQgbWVzc2FnZSBieQoqCW1lYW5zIG9mIGhjZl9yY3ZfbXNnLiBJdCBtdXN0IGJlIHByZXZlbnRlZCB0aGF0IHRoZSBMQU4gQ29udHJvbGxlciB3cml0ZXMgbmV3IGRhdGEgaW4gdGhlIE5JQyBidWZmZXIKKgliZWZvcmUgdGhlIE1TRiBpcyBmaW5pc2hlZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFRoZSBOSUMgYnVmZmVyIGlzIHJldHVybmVkIHRvIHRoZSBMQU4gQ29udHJvbGxlcgoqCXdoZW46CioJIC0gdGhlIGNvbXBsZXRlIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIgb3IKKgkgLSBoY2ZfcmN2X21zZyBpcyBjYWxsZWQgb3IKKgkgLSBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9SWCBpcyBjYWxsZWQgb3IKKgkgLSBoY2Zfc2VydmljZV9uaWMgaXMgY2FsbGVkIGFnYWluCioJSXQgY2FuIGJlIHJlYXNvbmVkIHRoYXQgaGNmX2FjdGlvbiggSU5UX09OICkgc2hvdWxkIG5vdCBiZSBnaXZlbiBiZWZvcmUgdGhlIE1TRiBoYXMgY29tcGxldGVseSBwcm9jZXNzZWQKKglhIHJlcG9ydGVkIFJ4LWZyYW1lLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIElOVF9PTiBhY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBjYXVzZSBhIChSeC0paW50ZXJydXB0ICh0aGUKKglNU0YgaXMgcHJvY2Vzc2luZyBhIFJ4LWZyYW1lLCBoZW5jZSB0aGUgUngtZXZlbnQgYml0IGluIHRoZSBIZXJtZXMgcmVnaXN0ZXIgbXVzdCBiZSBhY3RpdmUpLiBUaGlzCioJaW50ZXJydXB0IHdpbGwgY2F1c2UgaGNmX3NlcnZpY2VfbmljIHRvIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgYWNrLWluZyBvZiB0aGUgImxhc3QiIFJ4LWV2ZW50CioJdG8gdGhlIEhlcm1lcywgY2F1c2luZyB0aGUgSGVybWVzIHRvIGRpc2NhcmQgdGhlIGFzc29jaWF0ZWQgTklDIFJBTSBidWZmZXIuCiogQXNzZXJ0IGZhaWxzIGlmCiogLSBpZmJwIGlzIHplcm8gb3Igb3RoZXIgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKiAtIGhjZl9zZXJ2aWNlX25pYyBpcyBjYWxsZWQgd2l0aG91dCBhIHByaW9yIGNhbGwgdG8gaGNmX2Nvbm5lY3QuCiogLSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgoqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgoqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgoqCioKKi5ESUFHUkFNCioxOglJRkJfTGlua1N0YXQgaXMgY2xlYXJlZCwgaWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5CioJYnkgaXNyX2luZm8uCm9yCioxOglJRkJfTGlua1N0YXQgY2hhbmdlIGluZGljYXRpb24gaXMgY2xlYXJlZC4gSWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkCioJYWNjb3JkaW5nbHkgYnkgaXNyX2luZm8uCioyOiBJRkJfUnhMZW4gbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSB0aGUgTklDIHByZXNlbmNlIGNoZWNrIG90aGVyd2lzZToKKgkgLQl0aGlzIHZhbHVlIG1heSBzdGF5IG5vbi16ZXJvIGlmIHRoZSBOSUMgaXMgcHVsbGVkIG91dCBhdCBhbiBpbmNvbnZlbmllbnQgbW9tZW50LgoqCSAtCXRoZSBSeEFjayBvbiBhIHplcm8tRklEIG5lZWRzIGEgemVyby12YWx1ZSBmb3IgSUZCX1J4TGVuIHRvIHdvcmsKKgkgTm90ZSB0aGF0IGFzIHNpZGUtZWZmZWN0IG9mIHRoZSBoY2ZfYWN0aW9uIGNhbGwsIHRoZSByZW1haW5kZXIgb2YgUnggcmVsYXRlZCBpbmZvIGlzIHJlLWluaXRpYWxpemVkIGFzCioJIHdlbGwuCio0OglJbiBjYXNlIG9mIERlZnVuY3QgbW9kZSwgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IEhlcm1lcyBpcyB1bnJlbGlhYmxlLCBzbyB0aGUgYm9keSBvZgoqCWhjZl9zZXJ2aWNlX25pYyBpcyBza2lwcGVkLiBTaW5jZSBoY2ZfY250bCB0dXJucyBpbnRvIGEgTk9QIGlmIFByaW1hcnkgb3IgU3RhdGlvbiBGL1cgaXMgaW5jb21wYXRpYmxlLAoqCWhjZl9zZXJ2aWNlX25pYyBpcyBhbHNvIHNraXBwZWQgaW4gdGhvc2UgY2FzZXMuCioJVG8gcHJldmVudCB0aGF0IGhjZl9zZXJ2aWNlX25pYyByZXBvcnRzIGJvZ3VzIGluZm9ybWF0aW9uIHRvIHRoZSBNU0Ygd2l0aCBhbGwgLSBwb3NzaWJseSBkaWZmaWN1bHQgdG8KKglkZWJ1ZyAtIHVuZGVzaXJhYmxlIHNpZGUgZWZmZWN0cywgaXQgaXMgcGFyYW1vdW50IHRvIGNoZWNrIHRoZSBOSUMgcHJlc2VuY2UuIEluIGZvcm1lciBkYXlzIHRoZSBwcmVzZW5jZQoqCXRlc3Qgd2FzIGJhc2VkIG9uIHRoZSBIZXJtZXMgcmVnaXN0ZXIgSFJFR19TV18wLiBTaW5jZSBpbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2hvb3NlbiBmb3Igc3RyYXRlZ3kgYmFzZWQgb24KKglIUkVHX0VWX1NUQVQsIHRoaXMgaXMgbm93IGFsc28gdXNlZCBpbiBoY2Zfc2VydmljZV9uaWMuIFRoZSBtb3RpdmF0aW9uIHRvIGNoYW5nZSBzdHJhdGVneSBpcyBwYXJ0bHkKKglkdWUgdG8gaW5jb25zaXN0ZW50IEYvVyBpbXBsZW1lbnRhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEhSRUdfU1dfMCBtYW5pcHVsYXRpb24gYXJvdW5kIHJlc2V0IGFuZCBkb3dubG9hZC4KKglOb3RlIHRoYXQgaW4gcG9sbGVkIGVudmlyb25tZW50cyBDYXJkIFJlbW92YWwgaXMgbm90IGRldGVjdGVkIGJ5IElOVF9PRkYgd2hpY2ggbWFrZXMgdGhlIGNoZWNrIGluCioJaGNmX3NlcnZpY2VfbmljIGV2ZW4gbW9yZSBpbXBvcnRhbnQuCio4OglUaGUgZXZlbnQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBIZXJtZXMgaXMgc2FtcGxlZAoqCVRoZSBhc3NlcnQgY2hlY2tzIGZvciB1bmV4cGVjdGVkIGV2ZW50cyA7Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py4KKgkgLSBIUkVHX0VWX0lORk9fRFJPUCBpcyBleHBsaWNpdGx5IGV4Y2x1ZGVkIGZyb20gdGhlIGFjY2VwdGFibGUgSFJFR19FVl9TVEFUIGJpdHMgYmVjYXVzZSBpdCBpbmRpY2F0ZXMKKgkgICBhIHRvbyBoZWF2aWx5IGxvYWRlZCBzeXN0ZW0uCioJIC0gSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKgoqCioJSFJFR19FVl9UWF9FWEMgaXMgYWNjZXB0ZWQgKHZpYSBIUkVHX0VWX1RYX0VYVCkgaWYgYW5kIG9ubHkgaWYgSENGX0VYVF9JTlRfVFhfRVggc2V0IGluIHRoZSBIQ0ZfRVhUCioJZGVmaW5pdGlvbiBhdCBjb21waWxlIHRpbWUuCioJVGhlIGZvbGxvd2luZyBhY3Rpdml0aWVzIGFyZSBoYW5kbGVkOgoqCSAtCUFsbG9jIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBoY2Zfc2VuZF9tc2cgKGFuZCBub3RpZnkpLiBPbmx5IGlmIHRoZXJlIGlzIG5vICJzcGFyZSIgcmVzb3VyY2UsIHRoZQoqCQlhbGxvYyBldmVudCBpcyBzdXBlcmZpY2lhbGx5IHNlcnZpY2VkIGJ5IGhjZl9zZXJ2aWNlX25pYyB0byBjcmVhdGUgYSBwc2V1ZG8tcmVzb3VyY2Ugd2l0aCB2YWx1ZQoqCQkweDAwMS4gVGhpcyB2YWx1ZSBpcyByZWNvZ25pemVkIGJ5IGdldF9maWQgKGNhbGxlZCBieSBoY2Zfc2VuZF9tc2cgYW5kIG5vdGlmeSkgd2hlcmUgdGhlIHJlYWwKKgkJVHhGaWQgaXMgcmV0cmlldmVkIGFuZCB0aGUgSGVybWVzIGlzIGFja2VkIGFuZCAtIGhvcGVmdWxseSAtIHRoZSAibm9ybWFsIiBjYXNlIHdpdGggYSBzcGFyZSBUeEZpZAoqCQlpbiBJRkJfUnNjSW5kIGlzIHJlc3RvcmVkLgoqCSAtCUluZm8gZHJvcCBldmVudHMgYXJlIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIGEgdGFsbHkKKgkgLQlMaW5rRXZlbnQgKGluY2x1ZGluZyBzb2xpY2l0ZWQgYW5kIHVuc29saWNpdGVkIHRhbGxpZXMpIGFyZSBoYW5kbGVkIGJ5IHByb2NlZHVyZSBpc3JfaW5mby4KKgktCVR4RXggKGlmIHNlbGVjdGVkIGF0IGNvbXBpbGUgdGltZSkgaXMgaGFuZGxlZCBieSBjb3B5aW5nIHRoZSBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBUeEZTCioJCWludG8gdGhlIElGQiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBNU0YuCioJCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCioJTm90ZSwgdGhlIEFjayBvZiBhbGwgb2YgYWJvdmUgZXZlbnRzIGlzIGhhbmRsZWQgYXQgdGhlIGVuZCBvZiBoY2Zfc2VydmljZV9uaWMKKjE2OiBJbiBjYXNlIG9mICBub24tRE1BICggZWl0aGVyIG5vdCBjb21waWxlZCBpbiBvciBkdWUgdG8gYSBydW4tdGltZSBjaG9pY2UpOgoqCUlmIGFuIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSwgZmlyc3QgdGhlIEZJRCBvZiB0aGF0IGZyYW1lIGlzIHJlYWQsIGluY2x1ZGluZyB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZQoqCXplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLiBOb3RlIHRoYXQgc3VjaCBhIHplcm8tRklEIGlzIGFja25vd2xlZGdlZCBhdCB0aGUgZW5kIG9mCioJaGNmX3NlcnZpY2VfbmljIGFuZCB0aGF0IHRoaXMgZGVwZW5kcyBvbiB0aGUgSUZCX1J4TGVuIGluaXRpYWxpemF0aW9uIGluIHRoZSBiZWdpbiBvZiBoY2Zfc2VydmljZV9uaWMuCioJVGhlIEFzc2VydCB2YWxpZGF0ZXMgdGhlIEhDRiBhc3N1bXB0aW9uIGFib3V0IEhlcm1lcyBpbXBsZW1lbnRhdGlvbiB1cG9uIHdoaWNoIHRoZSByYW5nZSBvZgoqCVBzZXVkby1SSURzIGlzIGJhc2VkLgoqCVRoZW4gdGhlIGNvbnRyb2wgZmllbGRzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXJlIHJlYWQgZnJvbSB0aGUgTklDIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCioJVGhlIHN0YXR1cyBmaWVsZCBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKglUaGUgbGVuZ3RoIGlzLCBhZnRlciBpbXBsaWNpdCBFbmRpYW5lc3MgY29udmVyc2lvbiBpZiBuZWVkZWQsIGFuZCBhZGp1c3RtZW50IGZvciB0aGUgMTQgYnl0ZXMgb2YgdGhlCioJODAyLjMgTUFDIGhlYWRlciwgc3RvcmVkIGluIElGQl9SeExlbi4KKglJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIFRPVEFMIGxlbmd0aCBvZiAxNCBhcmUgcmVjZWl2ZWQsIHNvIHdpdGhvdXQgdGhpcwoqCWxlbmd0aCBhZGp1c3RtZW50LCBJRkJfUnhMZW4gY291bGQgbm90IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgZnJhbWVzIGZyb20gIm5vIGZyYW1lIi4KKglObyBNSUMgY2FsY3VsYXRpb24gcHJvY2Vzc2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlYWRpbmcgb2YgdGhlc2UgQ29udHJvbCBmaWVsZHMuCioyNjogVGhpcyBsZW5ndGggdGVzdCBmZWVscyBsaWtlIHN1cGVyZmx1b3VzIHJvYnVzdG5lc3MgYWdhaW5zdCBtYWxmb3JtZWQgZnJhbWVzLCBidXQgaXQgdHVybmVkIG91dCB0byBiZQoqCW5lZWRlZCBpbiB0aGUgcmVhbCAoaG9zdGlsZSkgd29ybGQuCioJVGhlIGRlY2Fwc3VsYXRpb24gY2hlY2sgbmVlZHMgc3VmZmljaWVudCBkYXRhIHRvIHJlcHJlc2VudCBEQSwgU0EsIEwsIFNOQVAgYW5kIFR5cGUgd2hpY2ggYW1vdW50cyB0bwoqCTIyIGJ5dGVzLiBJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIHNtYWxsZXIgbGVuZ3RoIGFyZSByZWNlaXZlZC4gVG8gcHJldmVudAoqCXRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGdvZXMgaGF5d2lyZSwgYSBjaGVjayBvbiB0aGUgbGVuZ3RoIGlzIG5lZWRlZC4KKglUaGUgYWN0dWFsIGRlY2Fwc3VsYXRpb24gdGFrZXMgcGxhY2Ugb24gdGhlIGZseSBpbiB0aGUgY29weWluZyBwcm9jZXNzIGJ5IG92ZXJ3cml0aW5nIHRoZSBTTkFQIGhlYWRlci4KKglOb3RlIHRoYXQgaW4gY2FzZSBvZiBkZWNhcHN1bGF0aW9uIHRoZSBTTkFQIGhlYWRlciBpcyBub3QgcGFzc2VkIHRvIHRoZSBNU0YsIGhlbmNlIElGQl9SeExlbiBtdXN0IGJlCioJY29tcGVuc2F0ZWQgZm9yIHRoZSBTTkFQIGhlYWRlciBsZW5ndGguCioJVGhlIDIyIGJ5dGVzIG5lZWRlZCBmb3IgZGVjYXBzdWxhdGlvbiBhcmUgKG1vcmUgdGhhbikgc3VmZmljaWVudCBmb3IgdGhlIGV4Y2VwdGlvbmFsIGhhbmRsaW5nIG9mIHRoZQoqCU1JQyBhbGdvcml0aG0gb2YgdGhlIEwtZmllbGQgKHJlcGxhY2luZyB0aGUgMiBieXRlIEwtZmllbGQgd2l0aCA0IDB4MDAgYnl0ZXMpLgoqMzA6IFRoZSAxMiBpbiB0aGUgbm8tU1NOIGJyYW5jaCBjb3JyZXNwb25kcyB3aXRoIHRoZSBnZXRfZnJhZywgdGhlIDIgd2l0aCB0aGUgSVBXIG9mIHRoZSBTU04gYnJhbmNoCiozMjogSWYgSGVybWVzIHJlcG9ydGVkIE1JQy1wcmVzZW5jZSwgdGhhbiB0aGUgTUlDIGVuZ2luZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBub24tZHVtbXkgTUlDIGNhbGN1bGF0aW9uCioJcm91dGluZSBhZGRyZXNzIGFuZCBhcHByb3ByaWF0ZSBrZXkuCiozNDogVGhlIDggYnl0ZXMgYWZ0ZXIgdGhlIERBLCBTQSwgTCBhcmUgcmVhZCBhbmQgaXQgaXMgY2hlY2tlZCB3aGV0aGVyIGRlY2Fwc3VsYXRpb24gaXMgbmVlZGVkIGkuZS46CioJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgVHVubmVsIGVuY2Fwc3VsYXRpb24gb3IKKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCAxMDQyIEVuY2Fwc3VsYXRpb24gYW5kIGhjZl9lbmNhcCByZXBvcnRzIHRoYXQgdGhlIEhDRiB3b3VsZCBub3QgaGF2ZSB1c2VkCioJCTEwNDIgYXMgdGhlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtCioJTm90ZSB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgUnhGUyBpbiBidWZwIGhhcyBOYXRpdmUgRW5kaWFuZXNzIGR1ZSB0byB0aGUgY29udmVyc2lvbiBkb25lIGJ5IHRoZQoqCUJFX1BBUiBpbiBnZXRfZnJhZy4KKjM2OiBUaGUgVHlwZSBmaWVsZCBpcyB0aGUgb25seSB3b3JkIGtlcHQgKGFmdGVyIG1vdmluZykgb2YgdGhlIGp1c3QgcmVhZCA4IGJ5dGVzLCBpdCBpcyBtb3ZlZCB0byB0aGUKKglMLWZpZWxkLiAgVGhlIG9yaWdpbmFsIEwtZmllbGQgYW5kIDYgYnl0ZSBTTkFQIGhlYWRlciBhcmUgZGlzY2FyZGVkLCBzbyBJRkJfUnhMZW4gYW5kIGJ1Zl9hZGRyIG11c3QKKgliZSBhZGp1c3RlZCBieSA4LgoqNDA6IERldGVybWluZSBob3cgbXVjaCBvZiB0aGUgZnJhbWUgKHN0YXJ0aW5nIHdpdGggREEpIGZpdHMgaW4gdGhlIExvb2thaGVhZCBidWZmZXIsIHRoZW4gcmVhZCB0aGUgbm90LXlldAoqCXJlYWQgZGF0YSBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgoqCUlmIHRoZSBsb29rYWhlYWQgYnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBtZXNzYWdlLCBjaGVjayB0aGUgTUlDLiBUaGUgbWFqb3JpdHkgY29uc2lkZXJlZCB0aGlzCioJSS9GIG1vcmUgYXBwcm9wcmlhdGUgdGhlbiBoYXZlIHRoZSBNU0YgY2FsbCBoY2ZfZ2V0X2RhdGEgb25seSB0byBjaGVjayB0aGUgTUlDLgoqNDQ6IFNpbmNlIHRoZSBjb21wbGV0ZSBtZXNzYWdlIGlzIGNvcGllZCBmcm9tIE5JQyBSQU0gdG8gUEMgUkFNLCB0aGUgUnggY2FuIGJlIGFja25vd2xlZGdlZCB0byB0aGUgSGVybWVzCioJdG8gb3B0aW1pemUgdGhlIGZsb3cgKCBhIGJldHRlciBjaGFuY2UgdG8gZ2V0IG5ldyBSeCBkYXRhIGluIHRoZSBuZXh0IHBhc3MgdGhyb3VnaCBoY2Zfc2VydmljZV9uaWMgKS4KKglUaGlzIGFja25vd2xlZGdlbWVudCBjYW4gbm90IGJlIGRvbmUgdmlhIGhjZl9hY3Rpb24oIEhDRl9BQ1RfUlhfQUNLICkgYmVjYXVzZSB0aGlzIGFsc28gY2xlYXJzCioJSUZCX1J4TEVOIHRodXMgY29ycnVwdGluZyB0aGUgSS9GIHRvIHRoZSBNU0YuCio7PzogSW4gY2FzZSBvZiBETUEgKGNvbXBpbGVkIGluIGFuZCBhY3RpdmF0ZWQpOgoKCio1NDogTGltaXRpbmcgdGhlIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgdGhlIEYvVyBpcyBhY2tlZCAoZS5nLiB0aGUgbWVyZ2luZyBvZiB0aGUgUngtQUNLIHdpdGggdGhlIG90aGVyCioJQUNLcyksIGlzIHN1cHBvc2VkIHRvIGRpbWluaXNoIHRoZSBwb3RlbnRpYWwgb2YgcmFjZSBjb25kaXRpb25zIGluIHRoZSBGL1cuCioJTm90ZSAxOiBUaGUgQ01EIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBjbWRfY21wbAoqCU5vdGUgMjogSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKglOb3RlIDM6IFRoZSBBTExPQyBldmVudCBpcyBhY2tub3dsZWRnZWQgaW4gZ2V0X2ZpZCAoZXhjZXB0IGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZmxvdykKKgoqLk5PVElDRQoqIFRoZSBOb24tRE1BIEhSRUdfRVZfUlggaXMgaGFuZGxlZCBkaWZmZXJlbnQgY29tcGFyZWQgd2l0aCB0aGUgb3RoZXIgRi9XIGV2ZW50cy4KKiBUaGUgSFJFR19FVl9SWCBldmVudCBpcyBhY2tub3dsZWRnZWQgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBjYWxsIGFmdGVyIHRoZQoqIGhjZl9zZXJ2aWNlX25pYyBjYWxsIHRoYXQgcmVwb3J0ZWQgdGhlIG9jY3VycmVuY2Ugb2YgdGhpcyBldmVudC4KKiBUaGlzIGFja25vd2xlZGdtZW50CiogbWFrZXMgdGhlIG5leHQgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKGlmIGFueSkgYXZhaWxhYmxlLgoqIEFuIHVwZGF0ZWQgSUZCX1J4TGVuCiogZmllbGQgcmVmbGVjdHMgdGhpcyBhdmFpbGFiaWxpdHkuCioKKi5OT1RJQ0UKKiBUaGUgbWluaW11bSBzaXplIGZvciBMZW4gbXVzdCBzdXBwbHkgc3BhY2UgZm9yOgoqIC0JYW4gRi9XIGRlcGVuZGVudCBudW1iZXIgb2YgYnl0ZXMgb2YgQ29udHJvbCBJbmZvIGZpZWxkIGluY2x1ZGluZyB0aGUgODAyLjExIEhlYWRlciBmaWVsZAoqIC0JRGVzdGluYXRpb24gQWRkcmVzcwoqIC0JU291cmNlIEFkZHJlc3MKKiAtCUxlbmd0aCBmaWVsZAoqIC0JWyBTTkFQIEhlYWRlcl0KKiAtCVsgRXRoZXJuZXQtSUkgVHlwZV0KKiBUaGlzIHJlc3VsdHMgaW4gNjggZm9yIEhlcm1lcy1JIGFuZCA4MCBmb3IgSGVybWVzLUlJCiogVGhpcyB3YXkgdGhlIG1pbmltdW0gYW1vdW50IG9mIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBuZWVkZWQgYnkgdGhlIEhDRiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUKKiBtdXN0IGJlIGRlY2Fwc3VsYXRlZC4KKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludApoY2Zfc2VydmljZV9uaWMoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApCnsKCmludAkJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8xNgkJc3RhdDsKd2NpX2J1ZnAJYnVmX2FkZHI7CmhjZl8xNiAJCWk7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRVJWSUNFX05JQywgaWZicC0+SUZCX0ludE9mZkNudCApCglIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCglIQ0ZBU1NFUlRfSU5UCgoJaWZicC0+SUZCX0xpbmtTdGF0ID0gMDsgLy8gOz8gdG8gYmUgb2Jzb2xldGVkIEFTQVAJCQkJCQkJCQkJCQkvKiAxKi8KCWlmYnAtPklGQl9EU0xpbmtTdGF0ICY9IH5DRkdfTElOS19TVEFUX0NIQU5HRTsJCQkJCQkJCQkJCQkJLyogMSovCgkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJCQkJCQkJCQkJCQkJLyogMiovCglpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmICggc3RhdCA9IElQVyggSFJFR19FVl9TVEFUICkgKSAhPSAweEZGRkYgKSB7CQkJCQkvKiA0Ki8KLyoJCUlGX05PVF9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH5IUkVHX0VWX0JBU0lDX01BU0ssIHN0YXQgKSApCiAqCQlJRl9OT1RfVVNFX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKICoJCUlGX1VTRV9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH4oIEhSRUdfRVZfQkFTSUNfTUFTSyBeICggSFJFR19FVl8uLi5ETUEuLi4uICksIHN0YXQgKSApCiAqLwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogOCovCgkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgJiYgc3RhdCAmIEhSRUdfRVZfQUxMT0MgKSB7IC8vTm90ZTogSUZCX1JzY0luZCBpcyBBTFdBWVMgMSBmb3IgRE1BCgkJCWlmYnAtPklGQl9Sc2NJbmQgPSAxOwoJCX0KCQlJRl9UQUxMWSggaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPX0RST1AgKSBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZJbmZvKys7ICkKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RJQ0sKCQlpZiAoIHN0YXQgJiBIUkVHX0VWX1RJQ0sgKSB7CgkJCWlmYnAtPklGQl9UaWNrQ250Kys7CgkJfQojaWYgMCAvLyAoSENGX1NMRUVQKSAmIEhDRl9ERFMKCQlpZiAoIGlmYnAtPklGQl9UaWNrQ250ID09IDMgJiYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsKQ0ZHX0REU19USUNLX1RJTUVfU1RSQ1QgbHR2OwoJCQkvLyAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpIGluIG5vdC1jb25uZWN0ZWQgbW9kZSAtLT5nbyBpbnRvIERTX09PUgoJCQloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1NMRUVQICk7CgkJCWlmYnAtPklGQl9EU0xpbmtTdGF0IHw9IENGR19MSU5LX1NUQVRfRFNfT09SOyAvL3NldCBPdXRPZlJhbmdlCgkJCWx0di5sZW4gPSAyOwoJCQlsdHYudHlwID0gQ0ZHX0REU19USUNLX1RJTUU7CgkJCWx0di50aWNrX3RpbWUgPSAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX1RJTUVSICkgKyAweDEwICkgKjY0OyAvLzc4IGlzIG1vcmUgcmlnaHQKCQkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmbHR2ICk7CgkJCXByaW50ayggIjw1PlByZXBhcmluZyBmb3Igc2xlZXAsIGxpbmtfc3RhdHVzOiAlMDRYLCB0aW1lciA6ICVkXG4iLAoJCQkJCWlmYnAtPklGQl9EU0xpbmtTdGF0LCBsdHYudGlja190aW1lICk7Ly87P3JlbW92ZSBtZSAxIGRheQoJCQlpZmJwLT5JRkJfVGlja0NudCsrOyAvLzs/anVzdCB0byBtYWtlIHN1cmUgd2UgZG8gbm90IGtlZXAgb24gcHJpbnRpbmcgYWJvdmUgbWVzc2FnZQoJCQlpZiAoIGx0di50aWNrX3RpbWUgPCAzMDAgKiAxMjUgKSBpZmJwLT5JRkJfRFNMaW5rU3RhdCArPSAweDAwMTA7CgoJCX0KI2VuZGlmIC8vIEhDRl9ERFMKI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RJQ0sKCQlpZiAoIHN0YXQgJiBIUkVHX0VWX0lORk8gKSB7CgkJCWlzcl9pbmZvKCBpZmJwICk7CgkJfQojaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVFhfRVgKCQlpZiAoIHN0YXQgJiBIUkVHX0VWX1RYX0VYVCAmJiAoIGkgPSBJUFcoIEhSRUdfVFhfQ09NUExfRklEICkgKSAhPSAwIC8qREFXQSovICkgewoJCQlEQVdBX1pFUk9fRklEKCBIUkVHX1RYX0NPTVBMX0ZJRCApCgkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgaSwgMCwgSU9fSU4gKTsKCQkJZ2V0X2ZyYWcoIGlmYnAsICZpZmJwLT5JRkJfVHhGc1N0YXQsIEhGU19TV1NVUCBCRV9QQVIoMSkgKTsKCQl9CiNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9UWF9FWAovLyFybGF2IERNQSBlbmdpbmUgd2lsbCBoYW5kbGUgdGhlIHJ4IGV2ZW50LCBub3QgdGhlIGRyaXZlcgojaWYgSENGX0RNQQoJCWlmICggISggaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICkgKSAvLyEhIGJlIGF3YXJlIG9mIHRoZSBsb2dpY2FsIGluZGVudGF0aW9ucwojZW5kaWYgLy8gSENGX0RNQQovKjE2Ki8JICBpZiAoIHN0YXQgJiBIUkVHX0VWX1JYICYmICggaWZicC0+SUZCX1J4RklEID0gSVBXKCBIUkVHX1JYX0ZJRCApICkgIT0gMCApIHsgLy9pZiAwIHRoZW4gREFXQV9BQ0sKCQkJSENGQVNTRVJUKCBidWZwLCBsZW4gKQoJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiwgbGVuICkKCQkJREFXQV9aRVJPX0ZJRCggSFJFR19SWF9GSUQgKQoJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeEZJRCA8IENGR19QUk9EX0RBVEEsIGlmYnAtPklGQl9SeEZJRCkKCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpZmJwLT5JRkJfUnhGSUQsIDAsIElPX0lOICk7CgkJCWdldF9mcmFnKCBpZmJwLCBidWZwLCBIRlNfQUREUl9ERVNUIEJFX1BBUigxKSApOwoJCQlpZmJwLT5JRkJfbGFwID0gYnVmX2FkZHIgPSBidWZwICsgSEZTX0FERFJfREVTVDsKCQkJaWZicC0+SUZCX1J4TGVuID0gKGhjZl8xNikoYnVmcFtIRlNfREFUX0xFTl0gKyAoYnVmcFtIRlNfREFUX0xFTisxXTw8OCkgKyAyKjYgKyAyKTsKLyoyNiovCQlpZiAoIGlmYnAtPklGQl9SeExlbiA+PSAyMiApIHsJCS8vIGNvbnZlbmllbnQgZm9yIE1JQyBjYWxjdWxhdGlvbiAoNSBEV3MgKyAxICJza2lwcGVkIiBXKQoJCQkJCQkJCQkJCQkvLy4gIGdldCBEQSxTQSxMZW4vVHlwZSBhbmQgKFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCi8qMzAqLwkJCWdldF9mcmFnKCBpZmJwLCBidWZfYWRkciwgMjIgQkVfUEFSKDApICk7Ci8qMzIqLwkJCUNBTENfUlhfTUlDKCBidWZwLCAtMSApOwkJLy8uICBpbml0aWFsaXplIE1JQwoJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBIQ0ZfREFTQV9TSVpFICk7CS8vLiAgTUlDIG92ZXIgREEsIFNBCgkJCQlDQUxDX1JYX01JQyggbnVsbF9hZGRyLCA0ICk7CS8vLiAgTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCgkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIrMTQsIDggKTsJLy8uICBza2lwIExlbiwgTUlDIG92ZXIgU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKCQkJCWJ1Zl9hZGRyICs9IDIyOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAovLyEhYmUgY2FyZWZ1bCBkbyBub3QgdXNlIHBvc2l0aXZlIHRlc3Qgb24gSENGX0FDVF9DQ1hfT0ZGLCBiZWNhdXNlIElGQl9DS0lQU3RhdCBpcyBpbml0aWFsbHkgMAoJCQkJaWYoIGlmYnAtPklGQl9DS0lQU3RhdCAhPSBIQ0ZfQUNUX0NDWF9PTiAgKQojZW5kaWYgLy8gSENGX1RZUEVfQ0NYCgkJCQl7CiNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCgkJCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIgKyBzaXplb2Yoc25hcF9oZWFkZXIpLCBsZW4gKQovKjM0Ki8gCQkJCWkgPSAqKHdjaV9yZWNvcmRwKSZidWZwW0hGU19TVEFUXSAmICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKTsKCQkJCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8CgkJCQkJCSAoIGkgPT0gSEZTX1NUQVRfMTA0MiAmJiBoY2ZfZW5jYXAoICh3Y2lfYnVmcCkmYnVmcFtIRlNfVFlQRV0gKSAhPSBFTkNfVFVOTkVMICkgKSB7CgkJCQkJCQkJCQkJCS8vLiAgY29weSBFLUlJIFR5cGUgdG8gODAyLjMgTEVOIGZpZWxkCi8qMzYqLwkJCQkJYnVmcFtIRlNfTEVOICBdID0gYnVmcFtIRlNfVFlQRSAgXTsKCQkJCQkJYnVmcFtIRlNfTEVOKzFdID0gYnVmcFtIRlNfVFlQRSsxXTsKCQkJCQkJCQkJCQkJLy8uICBkaXNjYXJkIFNuYXAgYnkgb3ZlcndyaXRpbmcgd2l0aCBkYXRhCgkJCQkJCWlmYnAtPklGQl9SeExlbiAtPSAoSEZTX1RZUEUgLSBIRlNfTEVOKTsKCQkJCQkJYnVmX2FkZHIgLT0gKCBIRlNfVFlQRSAtIEhGU19MRU4gKTsgLy8gdGhpcyBoYXBwZW5zIHRvIGJyaW5nIHVzIGF0IGEgRFcgYm91bmRhcnkgb2YgMzYKCQkJCQl9CiNlbmRpZiAvLyBIQ0ZfRU5DCgkJCQl9CgkJCX0KLyo0MCovCQlpZmJwLT5JRkJfbGFsID0gbWluKCAoaGNmXzE2KShsZW4gLSBIRlNfQUREUl9ERVNUKSwgaWZicC0+SUZCX1J4TGVuICk7CgkJCWkgPSBpZmJwLT5JRkJfbGFsIC0gKCBidWZfYWRkciAtICggYnVmcCArIEhGU19BRERSX0RFU1QgKSApOwoJCQlnZXRfZnJhZyggaWZicCwgYnVmX2FkZHIsIGkgQkVfUEFSKDApICk7CgkJCUNBTENfUlhfTUlDKCBidWZfYWRkciwgaSApOwojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoJCQlpZiAoIGlmYnAtPklGQl9sYWwgPT0gaWZicC0+SUZCX1J4TGVuICkgewoJCQkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsKCQkJfQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCi8qNDQqLwkJaWYgKCBsZW4gLSBIRlNfQUREUl9ERVNUID49IGlmYnAtPklGQl9SeExlbiApIHsKCQkJCWlmYnAtPklGQl9SeEZJRCA9IDA7CgkJCX0gZWxzZSB7IC8qIElGQl9SeEZJRCBpcyBjbGVhcmVkLCBzbyAgeW91IGRvIG5vdCBnZXQgYW5vdGhlciBSeF9BY2sgYXQgbmV4dCBlbnRyeSBvZiBoY2Zfc2VydmljZV9uaWMgKi8KCQkJCXN0YXQgJj0gKGhjZl8xNil+SFJFR19FVl9SWDsJLy9kb24ndCBhY2sgUnggaWYgcHJvY2Vzc2luZyBub3QgeWV0IGNvbXBsZXRlZAoJCQl9CgkJfQoJCS8vIGluIGNhc2Ugb2YgRE1BOiBzaWduYWwgYXZhaWxhYmlsaXR5IG9mIHJ4IGFuZC9vciB0eCBwYWNrZXRzIHRvIE1TRgoJCUlGX1VTRV9ETUEoIGlmYnAtPklGQl9EbWFQYWNrZXRzIHw9IHN0YXQgJiAoIEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEICk7ICkKCQkvLyBybGF2IDogcGVuZGluZyBIUkVHX0VWX1JETUFEIG9yIEhSRUdfRVZfVERNQUQgZXZlbnRzIGdldCBhY2tub3dsZWRnZWQgaGVyZS4KLyo1NCovCXN0YXQgJj0gKGhjZl8xNil+KCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfQ01EIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZIHwgSFJFR19FVl9BTExPQyB8IEhSRUdfRVZfRldfRE1BICk7Ci8vYSBwb3NpdGl2ZSBtYXNrIHdvdWxkIGJlIGVhc2llciB0byB1bmRlcnN0YW5kIC8qNTQqLwlzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOwoJCUlGX1VTRV9ETUEoIHN0YXQgJj0gKGhjZl8xNil+SFJFR19FVl9SWDsgKQoJCWlmICggc3RhdCApIHsKCQkJREFXQV9BQ0soIHN0YXQgKTsJLypEQVdBKi8KCQl9Cgl9CglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMgKQoJcmV0dXJuIHJjOwp9IC8vIGhjZl9zZXJ2aWNlX25pYwojZW5kaWYgLy8gSENGX0RMX09OTFkKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqKioqKioqKioqKioqKioqKioqKioqKioqIEggQyBGICAgUyBVIFAgUCBPIFIgVCAgIFIgTyBVIFQgSSBOIEUgUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCiouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHF1YWQgYnl0ZS4KKgoqLkFSR1VNRU5UUwoqCXAJCQlhZGRyZXNzIG9mIHRoZSBNSUMKKgltCQkJMzIgYml0IHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZQoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKiBjYWxjX21pYyBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1JQyBhbGdvcml0aG0uIEl0IGlzIGEgbW9ua2V5LXNlZSBtb25rZXktZG8gY29weSBvZgoqIE1pY2hhZWw6OmFwcGVuZEJ5dGUoKQoqIG9mIEFwcGVuZGl4IEMgb2YgLi4uLi4uLi4uLgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQoKI2RlZmluZSBST0wzMiggQSwgbiApICggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgICYgKCAoMVVMIDw8IChuKSkgLSAxICkgKSApCiNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQoKI2RlZmluZSBMCSpwCiNkZWZpbmUgUgkqKHArMSkKCnZvaWQKY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQp7CiNpZiBIQ0ZfQklHX0VORElBTgoJbSA9IChtID4+IDE2KSB8IChtIDw8IDE2KTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCglMIF49IG07CglSIF49IFJPTDMyKCBMLCAxNyApOwoJTCArPSBSOwoJUiBePSAoKEwgJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgoTCAmIDB4MDBmZjAwZmYpIDw8IDgpOwoJTCArPSBSOwoJUiBePSBST0wzMiggTCwgMyApOwoJTCArPSBSOwoJUiBePSBST1IzMiggTCwgMiApOwoJTCArPSBSOwp9IC8vIGNhbGNfbWljCiN1bmRlZiBSCiN1bmRlZiBMCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKCgoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCiouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgoqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogY2FsY19taWNfcnhfZnJhZyAuLi4uLi4uLgoqCiogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCiogVGhlIE1JQyBpcyBzZXBhcmF0ZSBmb3IgVHggYW5kIFJ4LCB0aHVzIGFsbG93aW5nIGhjZl9zZW5kX21zZyB0byBvY2N1ciBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQKKiBoY2ZfcmN2X21zZy4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmNhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCnsKc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsJLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCmludCBpOwoKCWlmICggbGVuID09IC0xICkgewkJCQkJCQkJLy9pbml0aWFsaXplIE1JQyBob3VzZWtlZXBpbmcKCQlpID0gKih3Y2lfcmVjb3JkcCkmcFtIRlNfU1RBVF07CgkJLyogaSA9IENOVl9TSE9SVFBfVE9fTElUVExFKCZwW0hGU19TVEFUXSk7IHNob3VsZCBub3QgYmUgbmVlZGUgdG8gcHJldmVudCBhbGlnbm1lbnQgcG9yb2JsZW1zCgkJICogc2luY2UgbGVuID09IC0xIGlmIGFuZCBvbmx5IGlmIHAgaXMgbG9va2FoYWVhZCBidWZmZXIgd2hpY2ggTVVTVCBiZSB3b3JkIGFsaWduZWQKCQkgKiB0byBiZSByZS1pbnZlc3RpZ2F0ZWQgYnkgTnZSCgkJICovCgoJCWlmICggKCBpICYgSEZTX1NUQVRfTUlDICkgPT0gMCApIHsKCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAweEZGRkY7CQkJLy9zdXBwcmVzcyBNSUMgY2FsY3VsYXRpb24KCQl9IGVsc2UgewoJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDA7Ci8vKglOb3RlIHRoYXQgImNvaW5jaWRlbnRhbGx5IiB0aGUgYml0IHBvc2l0aW9ucyB1c2VkIGluIEhGU19TVEFUCi8vKgljb3JyZXNwb25kIHdpdGggdGhlIG9mZnNldCBvZiB0aGUga2V5IGluIElGQl9NSUNLZXkKCQkJaSA9ICggaSAmIEhGU19TVEFUX01JQ19LRVlfSUQgKSA+PiAxMDsJLyogY29pbmNpZGVudGFsbHkgbm8gc2hpZnQgbmVlZGVkIGZvciBpIGl0c2VsZiAqLwoJCQlpZmJwLT5JRkJfTUlDUnhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1J4S2V5W2kgIF0pOwoJCQlpZmJwLT5JRkJfTUlDUnhbMV0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1J4S2V5W2krMV0pOwoJCX0KCX0gZWxzZSB7CgkJaWYgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA9PSAwICkgewoJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CgkJCXAgKz0gNDsKCQkJaWYgKCBsZW4gPCA0ICkgewoJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAoaGNmXzE2KWxlbjsKCQkJfSBlbHNlIHsKCQkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gNDsKCQkJCWxlbiAtPSA0OwoJCQl9CgkJfSBlbHNlIHdoaWxlICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPCA0ICYmIGxlbiApIHsJCS8vbm90ZSBmb3IgaGNmXzE2IGFwcGxpZXM6IDB4RkZGRiA+IDQKCQkJeC54OFtpZmJwLT5JRkJfTUlDUnhDYXJyeSsrXSA9ICpwKys7CgkJCWxlbi0tOwoJCX0KCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDQgKSB7CS8vY29udHJpdmVkIHNvIHdlIGhhdmUgb25seSAxIGNhbGwgdG8gY2FsY19taWMgc28gd2UgY291bGQgYnJpbmcgaXQgaW4tbGluZQoJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1J4LCB4LngzMiApOwoJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CgkJCXAgKz0gNDsKCQkJaWYgKCBsZW4gPCA0ICkgewoJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAoaGNmXzE2KWxlbjsKCQkJfQoJCQlsZW4gLT0gNDsKCQl9Cgl9Cn0gLy8gY2FsY19taWNfcnhfZnJhZwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgoKI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCiouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgoqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogY2FsY19taWNfdHhfZnJhZyAuLi4uLi4uLgoqCiogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCiogVGhlIE1JQyBpcyBzZXBhcmF0ZSBmb3IgVHggYW5kIFJ4LCB0aHVzIGFsbG93aW5nIGhjZl9zZW5kX21zZyB0byBvY2N1ciBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQKKiBoY2ZfcmN2X21zZy4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCmNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCnsKc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsJLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCgoJCQkJCQkJCQkJCQkJCS8vaWYgaW5pdGlhbGl6YXRpb24gcmVxdWVzdAoJaWYgKCBsZW4gPT0gLTEgKSB7CgkJCQkJCQkJCQkJCQkJLy8uICBwcmVzdW1lIE1JQyBjYWxjdWxhdGlvbiBkaXNhYmxlZAoJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gMHhGRkZGOwoJCQkJCQkJCQkJCQkJCS8vLiAgaWYgTUlDIGNhbGN1bGF0aW9uIGVuYWJsZWQKCQlpZiAoIGlmYnAtPklGQl9NSUNUeENudGwgKSB7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBjbGVhciBNSUMgY2FycnkKCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAwOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaW5pdGlhbGl6ZSBNSUMtZW5naW5lCgkJCWlmYnAtPklGQl9NSUNUeFswXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDVHhLZXlbMF0pOwkvKlR4IGFsd2F5cyB1c2VzIEtleSAwICovCgkJCWlmYnAtPklGQl9NSUNUeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDVHhLZXlbMV0pOwoJCX0KCQkJCQkJCQkJCQkJCQkvL2Vsc2UKCX0gZWxzZSB7CgkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgZW5hYmxlZCAoVHgpIC8gaWYgTUlDIHByZXNlbnQgKFJ4KQoJCQkJCQkJCQkJCQkJCS8vLiAgYW5kIG5vIGNhcnJ5IGZyb20gcHJldmlvdXMgY2FsY19taWNfZnJhZwoJCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPT0gMCApIHsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHByZXNldCBhY2N1IHdpdGggNCBieXRlcyBmcm9tIGJ1ZmZlcgoJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcG9pbnRlciBhY2NvcmRpbmdseQoJCQlwICs9IDQ7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCgkJCWlmICggbGVuIDwgNCApIHsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAoJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAoaGNmXzE2KWxlbjsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGVsc2UKCQkJfSBlbHNlIHsKCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGNvbXBsZXRlIGRvdWJsZSB3b3JkCgkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDQ7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKCQkJCWxlbiAtPSA0OwoJCQl9CgkJCQkJCQkJCQkJCQkJLy8uICBlbHNlIGlmIE1JQyBlbmFibGVkCgkJCQkJCQkJCQkJCQkJLy8uICBhbmQgaWYgY2FycnkgYnl0ZXMgZnJvbSBwcmV2aW91cyBjYWxjX21pY190eF9mcmFnCgkJCQkJCQkJCQkJCQkJLy8uICAuICBtb3ZlICgxLTMpIGJ5dGVzIGZyb20gY2FycnkgaW50byBhY2N1CgkJfSBlbHNlIHdoaWxlICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPCA0ICYmIGxlbiApIHsJCS8qIG5vdGUgZm9yIGhjZl8xNiBhcHBsaWVzOiAweEZGRkYgPiA0ICovCgkJCXgueDhbaWZicC0+SUZCX01JQ1R4Q2FycnkrK10gPSAqcCsrOwoJCQlsZW4tLTsKCQl9CgkJCQkJCQkJCQkJCQkJLy8uICB3aGlsZSBhY2N1IGNvbnRhaW5zIGNvbXBsZXRlIGRvdWJsZSB3b3JkCgkJCQkJCQkJCQkJCQkJLy8uICBhbmQgTUlDIGVuYWJsZWQKCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ID09IDQgKSB7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBwYXNzIGFjY3UgdG8gTUlDIGVuZ2luZQoJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1R4LCB4LngzMiApOwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBuZXh0IDQgYnl0ZXMgZnJvbSBidWZmZXIgdG8gYWNjdQoJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CgkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIHBvaW50ZXIKCQkJcCArPSA0OwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcwoJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5CgkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCgkJCWlmICggbGVuIDwgNCApIHsKCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CgkJCX0KCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCByZW1haW5pbmcgYnVmZmVyIGxlbmd0aAoJCQlsZW4gLT0gNDsKCQl9Cgl9Cn0gLy8gY2FsY19taWNfdHhfZnJhZwojZW5kaWYgLy8gSENGX1RZUEVfV1BBCgoKI2lmIEhDRl9QUk9UX1RJTUUKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIGNhbGlicmF0ZSggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQljYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIGNhbGlicmF0ZXMgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyIHRpY2sKKiBJRkJfVGlja0luaSBpcyB0aGUgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIHN1Y2ggdGhhdCB0aGUgZXhwaXJhdGlvbiBwZXJpb2QKKiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NvciBzcGVlZC4gSWYgSUZCX1RpY2tJbmkgaXMgbm90IHlldCBjYWxpYnJhdGVkLCBpdCBpcyBkb25lIG5vdy4KKiBUaGlzIGNhbGlicmF0aW9uIGlzICJyZWFzb25hYmx5IiBhY2N1cmF0ZSBiZWNhdXNlIHRoZSBIZXJtZXMgaXMgaW4gYSBxdWlldCBzdGF0ZSBhcyBhIHJlc3VsdCBvZiB0aGUKKiBJbml0aWFsaXplIGNvbW1hbmQuCioKKgoqLkRJQUdSQU0KKgoqMToJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgSU5JX1RJQ0tfSU5JIGJ5IGhjZl9jb25uZWN0LiBJZiBjYWxpYnJhdGUgc3VjY2VlZHMsIElGQl9UaWNrSW5pIGlzCioJZ3VhcmFudGVlZCB0byBiZSBjaGFuZ2VkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZXJlIHdpbGwgYmUgb25seSAxIHNob3QgYXQgY2FsaWJyYXRpb24gKHJlZ2FyZGxlc3Mgb2YgdGhlCioJbnVtYmVyIG9mIGluaXQgY2FsbHMpIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLgoqMjoJQ2FsaWJyYXRpb24gaXMgZG9uZSBIQ0ZfUFJPVF9USU1FX0NOVCB0aW1lcy4gVGhpcyBkaW1pbmlzaCB0aGUgZWZmZWN0cyBvZiBqaXR0ZXIgYW5kIGludGVyZmVyZW5jZSwKKgllc3BlY2lhbGx5IGluIGEgcHJlLWVtcHRpdmUgZW52aXJvbm1lbnQuIEhDRl9QUk9UX1RJTUVfQ05UIGlzIGluIHRoZSByYW5nZSBvZiAxNiB0aHJvdWdoIDMyIGFuZCBkZXJpdmVkCioJZnJvbSB0aGUgSENGX1BST1RfVElNRSBzcGVjaWZpZWQgYnkgdGhlIE1TRiBwcm9ncmFtbWVyLiBUaGUgZGl2aXNvciBuZWVkZWQgdG8gc2NhbGUgSENGX1BST1RfVElNRSBpbnRvIHRoZQoqCTE2LTMyIHJhbmdlLCBpcyB1c2VkIGFzIGEgbXVsdGlwbGljYXRvciBhZnRlciB0aGUgY2FsaWJyYXRpb24sIHRvIHNjYWxlIHRoZSBmb3VuZCB2YWx1ZSBiYWNrIHRvIHRoZQoqCXJlcXVlc3RlZCByYW5nZS4gVGhpcyB3YXkgYSBjb21wcm9taXNlIGlzIGFjaGlldmVkIGJldHdlZW4gYWNjdXJhY3kgYW5kIGR1cmF0aW9uIG9mIHRoZSBjYWxpYnJhdGlvbgoqCXByb2Nlc3MuCiozOglBY2tub3dsZWRnZSB0aGUgVGltZXIgVGljayBFdmVudC4KKglFYWNoIGN5Y2xlIGlzIGxpbWl0ZWQgdG8gYXQgbW9zdCBJTklfVElDS19JTkkgc2FtcGxlcyBvZiB0aGUgVGltZXJUaWNrIHN0YXR1cyBvZiB0aGUgSGVybWVzLgoqCVNpbmNlIHRoZSBzdGFydCBvZiBjYWxpYnJhdGUgaXMgdW5yZWxhdGVkIHRvIHRoZSBIZXJtZXMgSW50ZXJuYWwgVGltZXIsIHRoZSBmaXJzdCBpbnRlcnZhbCBtYXkgbGFzdCBmcm9tIDAKKgl0byB0aGUgbm9ybWFsIGludGVydmFsLCBhbGwgc3Vic2VxdWVudCBpbnRlcnZhbHMgc2hvdWxkIGJlIHRoZSBmdWxsIGxlbmd0aCBvZiB0aGUgSGVybWVzIFRpY2sgaW50ZXJ2YWwuCioJVGhlIEhlcm1lcyBUaW1lciBUaWNrIGlzIG5vdCByZXByb2dyYW1tZWQgYnkgdGhlIEhDRiwgaGVuY2UgaXQgaXMgcnVubmluZyBhdCB0aGUgZGVmYXVsdCBvZiAxMCBrCioJbWljcm9zZWNvbmRzLgoqNDoJSWYgdGhlIFRpbWVyIFRpY2sgRXZlbnQgaXMgY29udGludW91c2x5IHVwIChwcm90X2NudCBzdGlsbCBoYXMgdGhlIHZhbHVlIElOSV9USUNLX0lOSSkgb3Igbm8gVGltZXIgVGljawoqCUV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGUgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZWQsIHJlc2V0IElGQl9UaWNrSW5pIHRvIElOSV9USUNLX0lOSSwKKglzZXQgdGhlIGRlZnVuY3QgYml0IG9mIElGQl9DYXJkU3RhdCAodGh1cyByZW5kZXJpbmcgdGhlIEhlcm1lcyBpbm9wZXJhYmxlKSBhbmQgZXhpdCB0aGUgY2FsaWJyYXRlIHJvdXRpbmUuCio4OglpZmJwLT5JRkJfVGlja0luaSBpcyBtdWx0aXBsaWVkIHRvIHNjYWxlIHRoZSBmb3VuZCB2YWx1ZSBiYWNrIHRvIHRoZSByZXF1ZXN0ZWQgcmFuZ2UgYXMgZXhwbGFpbmVkIHVuZGVyIDIuCioKKi5OT1RJQ0UKKiBvIEFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiB2aWV3cG9pbnRzIHBvc3NpYmxlLCBjYWxpYnJhdGUoKSB1c2VzIGFzIGVycm9yIHN0cmF0ZWd5IHRoYXQgYSBzaW5nbGUKKglmYWlsdXJlIG9mIHRoZSBIZXJtZXMgVGltZXJUaWNrIGlzIGNvbnNpZGVyZWQgZmF0YWwuCiogbyBUaGVyZSBpcyBubyBoYXJkIGFuZCBjb25jcmV0ZSB0aW1lLW91dCB2YWx1ZSBkZWZpbmVkIGZvciBIZXJtZXMgYWN0aXZpdGllcy4gVGhlIGRlZmF1bHQgMSBzZWNvbmRzIGlzCioJYmVsaWV2ZWQgdG8gYmUgc3VmZmljaWVudGx5ICJyZWxheGVkIiBmb3IgcmVhbCBsaWZlIGFuZCB0byBiZSBzdWZmaWNpZW50bHkgc2hvcnQgdG8gYmUgc3RpbGwgdXNlZnVsIGluIGFuCioJZW52aXJvbm1lbnQgd2l0aCBodW1hbnMuCiogbyBOb3RlIHRoYXQgdmlhIElGQl9EZWZ1bmN0U3RhdCB0aW1lIG91dHMgaW4gY21kX3dhaXQgYW5kIGluIGhjZmlvX3N0cmluZyBibG9jayBhbGwgSGVybWVzIGFjY2VzcyB0aWxsIHRoZQoqCW5leHQgaW5pdCBzbyBmdW5jdGlvbnMgd2hpY2ggY2FsbCBhIG1peCBvZiBjbWRfd2FpdCBhbmQgaGNmaW9fc3RyaW5nIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cwoqCW9mIHRoZSBsYXN0IGNhbGwKKiBvIFRoZSByZXR1cm4gY29kZSBpcyBwcmVzZXQgYXQgVGltZSBvdXQuCioJVGhlIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9uIHRoYXQgbm8gY2FsaWJyYXRlZCB2YWx1ZSBmb3IgdGhlIHByb3RlY3Rpb24gY291bnQgY2FuIGJlIGFzc3VtZWQgc2luY2UKKgljYWxpYnJhdGUoKSBkb2VzIG5vdCB5ZXQgaGF2ZSBkZXRlcm1pbmVkIGEgY2FsaWJyYXRlZCB2YWx1ZSAoYSBjYXRjaCAyMiksIGlzIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUKKglpbml0aWFsIHZhbHVlIGF0IElOSV9USUNLX0lOSSAoYnkgaGNmX2Nvbm5lY3QpLiBUaGlzIGFwcHJvYWNoIGlzIGNvbnNpZGVyZWQgc2FmZSwgYmVjYXVzZToKKgkgIC0gdGhlIEhDRiBkb2VzIG5vdCB1c2UgdGhlIHBpcGVsaW5lIG1lY2hhbmlzbSBvZiBIZXJtZXMgY29tbWFuZHMuCioJICAtIHRoZSBsaWtlbGlob29kIG9mIGZhaWx1cmUgKHRoZSBvbmx5IHRpbWUgd2hlbiBwcm90ZWN0aW9uIGNvdW50IGlzIHJlbGV2YW50KSBpcyBzbWFsbC4KKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgbGFyZ2Ugb24gYSBmYXN0IG1hY2hpbmUgKGJ1c3kgYml0IGRyb3BzIG9uIGdvb2QgTklDIGJlZm9yZSBjb3VudGVyCioJCWV4cGlyZXMpCioJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IHNtYWxsIG9uIGEgc2xvdyBtYWNoaW5lIChjb3VudGVyIGV4cGlyZXMgb24gYmFkIE5JQyBiZWZvcmUgdGhlIGVuZCB1c2VyCioJICAJc3dpdGNoZXMgdGhlIHBvd2VyIG9mZiBpbiBkZXNwYWlyCioJVGhlIHRpbWUgbmVlZGVkIHRvIHdyYXAgYSAzMiBiaXQgY291bnRlciBhcm91bmQgaXMgbG9uZ2VyIHRoYW4gbWFueSBodW1hbnMgd2FudCB0byB3YWl0LCBoZW5jZSB0aGUgbW9yZSBvcgoqCWxlc3MgYXJiaXRyYXJ5IHZhbHVlIG9mIDB4NDAwMDBMIGlzIGNob3NlbiwgYXNzdW1pbmcgaXQgZG9lcyBub3QgdGFrZSB0b28gbG9uZyBvbiBhbiBYVCBhbmQgaXMgbm90IHRvbwoqCXNob3J0IG9uIGEgc2NyZWFtLW1hY2hpbmUuCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApjYWxpYnJhdGUoIElGQlAgaWZicCApCnsKaW50CQljbnQgPSBIQ0ZfUFJPVF9USU1FX0NOVDsKaGNmXzMyCXByb3RfY250OwoKCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFICk7CglpZiAoIGlmYnAtPklGQl9UaWNrSW5pID09IElOSV9USUNLX0lOSSApIHsJCQkJCQkJCQkJCQkJLyoxKi8KCQlpZmJwLT5JRkJfVGlja0luaSA9IDA7CQkJCQkJCQkJCQkJCQkJCQkvKjIqLwoJCQl3aGlsZSAoIGNudC0tICkgewoJCQkJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CgkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1RJQ0sgKTsJCQkJCQkJCQkJCQkvKjMqLwoJCQkJd2hpbGUgKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfVElDSykgPT0gMCAmJiAtLXByb3RfY250ICkgewoJCQkJCWlmYnAtPklGQl9UaWNrSW5pKys7CgkJCQl9CgkJCQlpZiAoIHByb3RfY250ID09IDAgfHwgcHJvdF9jbnQgPT0gSU5JX1RJQ0tfSU5JICkgewkJCQkJCQkJLyo0Ki8KCQkJCQlpZmJwLT5JRkJfVGlja0luaSA9IElOSV9USUNLX0lOSTsKCQkJCQlpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRVI7CgkJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwoJCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBwcm90X2NudCApCgkJCQl9CgkJCX0KCQlpZmJwLT5JRkJfVGlja0luaSA8PD0gSENGX1BST1RfVElNRV9TSEZUOwkJCQkJCQkJCQkJCS8qOCovCgl9CglIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0NBTElCUkFURSB8IEhDRl9UUkFDRV9FWElUICk7Cn0gLy8gY2FsaWJyYXRlCiNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCgoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAojaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCWludCBjaGVja19taWMoIElGQlAgaWZicCApCiouUFVSUE9TRQkJdmVyaWZpZXMgdGhlIE1JQyBvZiBhIHJlY2VpdmVkIG5vbi1VU0IgZnJhbWUuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwoqCUhDRl9FUlJfTUlDCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioKKjQ6CXRlc3Qgd2hldGhlciBvciBub3QgYSBNSUMgaXMgcmVwb3J0ZWQgYnkgdGhlIEhlcm1lcwoqMTQ6IHRoZSBjYWxjdWxhdGVkIE1JQyBhbmQgdGhlIHJlY2VpdmVkIE1JQyBhcmUgY29tcGFyZWQsIHRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCB3aGVuIHRoZXJlIGlzIGEgbWlzbWF0Y2gKKgoqLk5PVElDRQoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CmNoZWNrX21pYyggSUZCUCBpZmJwICkKewppbnQJCXJjID0gSENGX1NVQ0NFU1M7CmhjZl8zMiB4MzJbMl07CQkJCS8vKiBhcmVhIHRvIHNhdmUgcmN2ZCA4IGJ5dGVzIE1JQwoKCQkJCQkJCQkJCQkJCS8vaWYgTUlDIHByZXNlbnQgaW4gUnhGUwoJaWYgKCAqKHdjaV9yZWNvcmRwKSZpZmJwLT5JRkJfbGFwWy1IRlNfQUREUl9ERVNUXSAmIEhGU19TVEFUX01JQyApIHsKCS8vb3IgaWYgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSAhPSAweEZGRkYgKQoJCUNBTENfUlhfTUlDKCBtaWNfcGFkLCA4ICk7CQkJCQkvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgoJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApeDMyLCA4IEJFX1BBUigwKSk7Ly8uICBnZXQgOCBieXRlIE1JQyBmcm9tIE5JQwoJCQkJCQkJCQkJCQkJLy8uICBpZiBjYWxjdWxhdGVkIGFuZCByZWNlaXZlZCBNSUMgZG8gbm90IG1hdGNoCgkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKLyoxNCovICBpZiAoIHgzMlswXSAhPSBDTlZfTElUVExFX1RPX0xPTkcoaWZicC0+SUZCX01JQ1J4WzBdKSB8fAogICAgICAgIAkgeDMyWzFdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMV0pCSAgKSB7CgkJCXJjID0gSENGX0VSUl9NSUM7CgkJfQoJfQoJCQkJCQkJCQkJCQkJLy9yZXR1cm4gc3RhdHVzCglyZXR1cm4gcmM7Cn0gLy8gY2hlY2tfbWljCiNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgY21kX2NtcGwoIElGQlAgaWZicCApCiouUFVSUE9TRQkJd2FpdHMgZm9yIEhlcm1lcyBDb21tYW5kIENvbXBsZXRpb24uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglJRkJfRGVmdW5jdFN0YXQKKglIQ0ZfRVJSX1RJTUVfT1VUCioJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKglIQ0ZfU1VDQ0VTUwoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqCioyOglPbmNlIGNtZF9jbXBsIGlzIGNhbGxlZCwgdGhlIEJ1c3kgb3B0aW9uIGJpdCBpbiBJRkJfQ21kIG11c3QgYmUgY2xlYXJlZAoqNDoJSWYgU3RhdHVzIHJlZ2lzdGVyIGFuZCBjb21tYW5kIGNvZGUgZG9uJ3QgbWF0Y2ggZWl0aGVyOgoqCSAtIHRoZSBIZXJtZXMgYW5kIEhvc3QgYXJlIG91dCBvZiBzeW5jICggYSBmYXRhbCBlcnJvcikKKgkgLSBlcnJvciBiaXRzIGFyZSByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3Rlci4KKglPdXQgb2Ygc3luYyBpcyBjb25zaWRlcmVkIGZhdGFsIGFuZCBicmluZ3MgdGhlIEhDRiBpbiBEZWZ1bmN0IG1vZGUKKglFcnJvcnMgcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIgc2hvdWxkIGJlIGNhdXNlZCBieSBzZXF1ZW5jZSB2aW9sYXRpb25zIGluIEhlcm1lcyBjb21tYW5kCioJc2VxdWVuY2VzIGFuZCBoZW5jZSB0aGVzZSBidWdzIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgZHVyaW5nIGVuZ2luZWVyaW5nIHRlc3RpbmcuIFNpbmNlIHRoZXJlIGlzIG5vCioJc3RyYXRlZ3kgdG8gY29wZSB3aXRoIHRoaXMgcHJvYmxlbSwgaXQgbWlnaHQgYXMgd2VsbCBiZSBpZ25vcmVkIGF0IHJ1biB0aW1lLiBOb3RlIHRoYXQgZm9yIGFueSBwYXJ0aWN1bGFyCioJc2l0dWF0aW9uIHdoZXJlIGEgc3RyYXRlZ3kgaXMgZm9ybXVsYXRlZCB0byBoYW5kbGUgdGhlIGNvbnNlcXVlbmNlcyBvZiBhIHBhcnRpY3VsYXIgYnVnIGNhdXNpbmcgYQoqCXBhcnRpY3VsYXIgRXJyb3Igc2l0dWF0aW9uIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLCB0aGUgYnVnIHNob3VsZCBiZSByZW1vdmVkIHJhdGhlciB0aGFuIGFkZGluZwoqCWxvZ2ljIHRvIGNvcGUgd2l0aCB0aGUgY29uc2VxdWVuY2VzIG9mIHRoZSBidWcuCioJVGhlcmUgaGF2ZSBiZWVuIEhDRiB2ZXJzaW9ucyB3aGVyZSBhbiBlcnJvciByZXBvcnQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIgZXZlbiBicm91Z2h0IHRoZSBIQ0YgaW4gZGVmdW5jdAoqCW1vZGUgKGFsdGhvdWdoIGl0IHdhcyBub3QgeWV0IG5hbWVkIGxpa2UgdGhhdCBhdCB0aGF0IHRpbWUpLiBUaGlzIGlzIHBhcnRpY3VsYXIgdW5kZXNpcmFibGUgYmVoYXZpb3IgZm9yIGEKKglnZW5lcmFsIGxpYnJhcnkuCioJU2ltcGx5IHJlcG9ydGluZyB0aGUgZXJyb3IgKGFzICJpbnRlcmVzdGluZyIpIGlzIGRlYmF0YWJsZS4gVGhlcmUgYWxzbyBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdpdGggdGhpcwoqCXN0cmF0ZWd5IHVzaW5nIHRoZSAidmFndWUiIEhDRl9GQUlMVVJFIGNvZGUuCioJVGhlIGVycm9yIGlzIHJlcG9ydGVkIHZpYToKKgkgLSBNaXNjRXJyIHRhbGx5IG9mIHRoZSBIQ0YgVGFsbHkgc2V0CioJIC0gdGhlIChpbmZvcm1hdGl2ZSkgZmllbGRzIElGQl9FcnJDbWQgYW5kIElGQl9FcnJRdWFsaWZpZXIKKgkgLSB0aGUgYXNzZXJ0IG1lY2hhbmlzbQoqODoJSGVyZSB0aGUgRGVmdW5jdCBjYXNlIGFuZCB0aGUgU3RhdHVzIGVycm9yIGFyZSBzZXBhcmF0ZWx5IHRyZWF0ZWQKKgoqCiouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQ0ZfU1RBVElDIGludApjbWRfY21wbCggSUZCUCBpZmJwICkKewoKUFJPVF9DTlRfSU5JCmludAkJcmMgPSBIQ0ZfU1VDQ0VTUzsKaGNmXzE2CXN0YXQ7CgoJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfQ1BMLCBpZmJwLT5JRkJfQ21kICkKCWlmYnAtPklGQl9DbWQgJj0gfkhDTURfQlVTWTsJCQkJCQkJCQkJCQkvKiAyICovCglIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CQkJCQkvKiA0ICovCglzdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKI2lmIEhDRl9QUk9UX1RJTUUKCWlmICggcHJvdF9jbnQgPT0gMCApIHsKCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQoJCXJjID0gSENGX0VSUl9USU1FX09VVDsKCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgaWZicC0+SUZCX0NtZCApCgl9IGVsc2UKI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKCXsKCQlEQVdBX0FDSyggSFJFR19FVl9DTUQgKTsKLyo0Ki8JaWYgKCBzdGF0ICE9IChpZmJwLT5JRkJfQ21kICYgSENNRF9DTURfQ09ERSkgKSB7Ci8qOCovCQlpZiAoICggKHN0YXQgXiBpZmJwLT5JRkJfQ21kICkgJiBIQ01EX0NNRF9DT0RFKSAhPSAwICkgewoJCQkJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUTsKCQkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKCQkJfQoJCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQoJCQlpZmJwLT5JRkJfRXJyQ21kID0gc3RhdDsKCQkJaWZicC0+SUZCX0VyclF1YWxpZmllciA9IElQVyggSFJFR19SRVNQXzAgKTsKCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIElQVyggSFJFR19QQVJBTV8wICksIGlmYnAtPklGQl9DbWQgKSApCgkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBpZmJwLT5JRkJfRXJyUXVhbGlmaWVyLCBpZmJwLT5JRkJfRXJyQ21kICkgKQoJCX0KCX0KCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0NNRF9DUEwgKQoJcmV0dXJuIHJjOwp9IC8vIGNtZF9jbXBsCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgY21kX2V4ZSggSUZCUCBpZmJwLCBpbnQgY21kX2NvZGUsIGludCBwYXJfMCApCiouUFVSUE9TRQkJRXhlY3V0ZXMgc3luY2hyb25vdXMgcGFydCBvZiBIZXJtZXMgQ29tbWFuZCBhbmQgLSBvcHRpb25hbGx5IC0gd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbi4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWNtZF9jb2RlCioJcGFyXzAKKgoqLlJFVFVSTlMKKglJRkJfRGVmdW5jdFN0YXQKKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQoqCUhDRl9TVUNDRVNTCioJSENGX0VSUl9UT19CRV9BRERFRAk8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAoqCiouREVTQ1JJUFRJT04KKiBFeGVjdXRlcyBzeW5jaHJvbm91cyBIZXJtZXMgQ29tbWFuZCBhbmQgd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbgoqCiogVGhlIGdlbmVyYWwgSENGIHN0cmF0ZWd5IGlzIHRvIHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gQXMgYSBjb25zZXF1ZW5jZToKKiAtIHRoZSByZWFkIG9mIHRoZSBidXN5IGJpdCBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBzdXBlcmZsdW91cwoqIC0gdGhlIEhlcm1lcyByZXF1aXJlbWVudCB0aGF0IG5vIElucXVpcnkgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4gdW5hY2tub3dsZWRnZWQKKglJbnF1aXJ5IGNvbW1hbmQgb3V0c3RhbmRpbmcsIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgoqIFRoZSBUeCBjb21tYW5kIHVzZXMgdGhlICJCdXN5IiBiaXQgaW4gdGhlIGNtZF9jb2RlIHBhcmFtZXRlciB0byBkZXZpYXRlIGZyb20gdGhpcyBnZW5lcmFsIEhDRiBzdHJhdGVneS4KKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IG5vdCBidXN5LXdhaXRpbmcgb24gY29tcGxldGlvbiBvZiB0aGlzIGZyZXF1ZW50bHkgdXNlZCBjb21tYW5kIHRoZSBwcm9jZXNzb3IKKiB1dGlsaXphdGlvbiBpcyBkaW1pbmlzaGVkIHdoaWxlIHVzaW5nIHRoZSBidXN5LXdhaXQgb24gYWxsIG90aGVyIHNlbGRvbSB1c2VkIGNvbW1hbmRzIHRoZSBmbG93IGlzIGtlcHQKKiBzaW1wbGUuCioKKgoqCiouRElBR1JBTQoqCioxOglza2lwIHRoZSBib2R5IG9mIGNtZF9leGUgd2hlbiBpbiBkZWZ1bmN0IG1vZGUgb3Igd2hlbiAtIGJhc2VkIG9uIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciB3cml0ZSBhbmQKKglyZWFkIGJhY2sgdGVzdCAtIHRoZXJlIGlzIGFwcGFyZW50bHkgbm8gTklDLgoqCU5vdGU6IHdlIGdhdmUgdXAgb24gdGhlICJvbGQiIHN0cmF0ZWd5IHRvIHdyaXRlIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciBhdCBtYWdpYyBvbmx5IHdoZW4gbmVlZGVkLiBEdWUgdG8KKgl0aGUgaW50cmljYXRlbmVzcyBvZiBIZXJtZXMgRi9XIHZhcmlldGllcyAoIHdoaWNoIGJlaGF2ZSBkaWZmZXJlbnRseSBhcyBmYXIgYXMgY29ycnVwdGlvbiBvZiB0aGUgUy9XCioJU3VwcG9ydCByZWdpc3RlciBpcyBpbnZvbHZlZCksIHRoZSBpbmNyZWFzaW5nIG51bWJlciBvZiBIZXJtZXMgY29tbWFuZHMgd2hpY2ggZG8gYW4gaW1wbGljaXQgaW5pdGlhbGl6ZQoqCSh0aHVzIG1vZGlmeWluZyB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIpIGFuZCB0aGUgd29ya2Fyb3VuZHMgb2Ygc29tZSBPUy9TdXBwb3J0IFMvVyBpbmR1Y2VkIGFzcGVjdHMgKGUuZy4KKgl0aGUgU3lzdGVtIFNvZnQgbGlicmFyeSBhdCBXaW5OVCB3aGljaCBwb3N0cG9uZXMgdGhlIGFjdHVhbCBtYXBwaW5nIG9mIEkvTyBzcGFjZSB1cCB0byAzMCBzZWNvbmRzIGFmdGVyCioJZ2l2aW5nIHRoZSBnby1haGVhZCksIHRoZSAibWFnaWMiIHN0cmF0ZWd5IGlzIG5vdyByZWR1Y2VkIHRvIGEgc2ltcGxlIHdyaXRlIGFuZCByZWFkIGJhY2suIFRoaXMgbWVhbnMgdGhhdAoqCXByb2JsZW1zIGxpa2UgYSBidWcgdHJhbXBpbmcgb3ZlciB0aGUgbWVtb3J5IG1hcHBlZCBIZXJtZXMgcmVnaXN0ZXJzIHdpbGwgbm8gbG9uZ2VyIGJlIG5vdGljZWQgYXMgc2lkZQoqCWVmZmVjdCBvZiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgY2hlY2suCioyOgljaGVjayB3aGV0aGVyIHRoZSBwcmVjZWRpbmcgY29tbWFuZCBza2lwcGVkIHRoZSBidXN5IHdhaXQgYW5kIGlmIHNvLCBjaGVjayBmb3IgY29tbWFuZCBjb21wbGV0aW9uCioKKi5OT1RJQ0UKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpIQ0ZfU1RBVElDIGludApjbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICkJLy9pZiBIQ01EX0JVU1kgb2YgY21kX2NvZGUgc2V0LCB0aGVuIGRvIE5PVCB3YWl0IGZvciBjb21wbGV0aW9uCnsKaW50IHJjOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ01EX0VYRSwgY21kX2NvZGUgKQoJSENGQVNTRVJUKCAoY21kX2NvZGUgJiBIQ01EX0NNRF9DT0RFKSAhPSBIQ01EX1RYIHx8IGNtZF9jb2RlICYgSENNRF9CVVNZLCBjbWRfY29kZSApIC8vVHggbXVzdCBoYXZlIEJ1c3kgYml0IHNldAoJT1BXKCBIUkVHX1NXXzAsIEhDRl9NQUdJQyApOwoJaWYgKCBJUFcoIEhSRUdfU1dfMCApID09IEhDRl9NQUdJQyApIHsJCQkJCQkJCQkJCQkJCS8qIDEgKi8KCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdDsKCX0KCWVsc2UgcmMgPSBIQ0ZfRVJSX05PX05JQzsKCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CgkJLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0Ci8qMiovCWlmICggaWZicC0+SUZCX0NtZCAmIEhDTURfQlVTWSApIHsKCQkJcmMgPSBjbWRfY21wbCggaWZicCApOwoJCX0KCQlPUFcoIEhSRUdfUEFSQU1fMCwgcGFyXzAgKTsKCQlPUFcoIEhSRUdfQ01ELCBjbWRfY29kZSAmfkhDTURfQlVTWSApOwoJCWlmYnAtPklGQl9DbWQgPSBjbWRfY29kZTsKCQlpZiAoIChjbWRfY29kZSAmIEhDTURfQlVTWSkgPT0gMCApIHsJLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0CgkJCXJjID0gY21kX2NtcGwoIGlmYnAgKTsKCQl9Cgl9CglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCBNRVJHRV8yKCByYywgY21kX2NvZGUgKSApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0VYRSApCglyZXR1cm4gcmM7Cn0gLy8gY21kX2V4ZQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IGRvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCiouUFVSUE9TRQkJZG93bmxvYWRzIEYvVyBpbWFnZSBpbnRvIE5JQyBhbmQgaW5pdGlhdGVzIGV4ZWN1dGlvbiBvZiB0aGUgZG93bmxvYWRlZCBGL1cuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsdHZwCQlzcGVjaWZpZXMgdGhlIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQoqCiouUkVUVVJOUwoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqMToJRmlyc3QsIEFjayBldmVyeXRoaW5nIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQoqCU5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKglwZW5kaW5nCioJTm90ZSAyOiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBzdHJhdGVneSB0YWtlcyBhd2F5IHRoZSBuZWVkIHRvIGFjayBldmVyeSBjb25jZWl2YWJsZSBldmVudCBhZnRlciBhbgoqCUhlcm1lcyBJbml0aWFsaXplCioKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICkJCQkJCQkvL0hlcm1lcy1JSSBkb3dubG9hZCAodm9sYXRpbGUgb25seSkKewpoY2ZfMTYJCQkJaTsKaW50CQkJCQlyYyA9IEhDRl9TVUNDRVNTOwp3Y2lfYnVmcAkJCWNwOwpoY2ZfaW8JCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfREwsIGx0dnAtPnR5cCApCiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVECglIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+bW9kZSApCiNlbHNlCgkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgoJaWYgKCBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1NUT1AgJiYgbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSkgewoJCQkJCQkJCQkJCQkJLy8uICBzd2l0Y2ggSGVybWVzIHRvIGluaXRpYWwgbW9kZQovKjEqLwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfSU5JLCAwICk7CS8qIEhDTURfSU5JIGNhbiBub3QgYmUgcGFydCBvZiBpbml0KCkgYmVjYXVzZSB0aGF0IGlzIGNhbGxlZCBvbgoJCQkJCQkJCQkJCSAqIG90aGVyIG9jY2FzaW9ucyBhcyB3ZWxsICovCgkJcmMgPSBpbml0KCBpZmJwICk7Cgl9CgkJCQkJCQkJCQkJCQkvL2lmIGZpbmFsICJwcm9ncmFtIiBMVFYKCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGlmYnAtPklGQl9ETE1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKCQkJCQkJCQkJCQkJCS8vLiAgc3RhcnQgdGVydGlhcnkgKG9yIHNlY29uZGFyeSkKCQlPUFcoIEhSRUdfUEFSQU1fMSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYpICk7CgkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0VYRUNVVEUsIChoY2ZfMTYpIGx0dnAtPm5pY19hZGRyICk7CgkJaWYgKHJjID09IEhDRl9TVUNDRVNTKSB7CgkJCXJjID0gaW5pdCggaWZicCApOwkvKjs/IGRvIHdlIHJlYWxseSB3YW50IHRvIHNraXAgaW5pdCBpZiBjbWRfZXhlIGZhaWxlZCwgaS5lLgoJCQkJCQkJCSAqCSBJRkJfRldfQ29tcF9JZCBpcyB0aGFuIHBvc3NpYmx5IGluY29ycmVjdCAqLwoJICAJfQoJCQkJCQkJCQkJCQkJLy9lbHNlIChub24tZmluYWwpCgl9IGVsc2UgewoJCQkJCQkJCQkJCQkJLy8uICBpZiBtb2RlID09IFJlYWRiYWNrIFNFRVBST00KI2lmIDAJLy87PyBhcyBsb25nIGFzIHRoZSBuZXh0IGlmIGNvbnRhaW5zIGEgaGFyZCBjb2RlZCAwLCBtaWdodCBhcyB3ZWxsIGxlYXZlIGl0IG91dCBldmVuIG1vcmUgb2J2aW91cwoJCWlmICggMCAvKmxlbiBpcyBkZWZpbml0ZWx5IG5vdCB3YW50IHdlIHdhbnQ7PyovICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU0VFUFJPTV9SRUFEQkFDSyApIHsKCQkJT1BXKCBIUkVHX1BBUkFNXzEsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2KSApOwoJCQlPUFcoIEhSRUdfUEFSQU1fMiwgTVVMX0JZXzIobHR2cC0+bGVuIC0gNCkpOwoJCQkJCQkJCQkJCQkJLy8uICAuICBwZXJmb3JtIEhlcm1lcyBwcm9nIGNtZCB3aXRoIGFwcHJvcHJpYXRlIG1vZGUgYml0cwoJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfUFJPR1JBTSB8IGx0dnAtPm1vZGUsIChoY2ZfMTYpbHR2cC0+bmljX2FkZHIgKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgYWNjb3JkaW5nIFJlc3AwLTEKCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAgIElQVyggSFJFR19SRVNQXzEpICk7CgkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCBJUFcoIEhSRUdfUkVTUF8wKSApOwoJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgdXAgTC1maWVsZCBvZiBMVFYgYWNjb3JkaW5nIFJlc3AyCgkJCWkgPSAoIElQVyggSFJFR19SRVNQXzIgKSArIDEgKSAvIDI7ICAvLyBpIGNvbnRhaW5zIG1heCBidWZmZXIgc2l6ZSBpbiB3b3JkcywgYSBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gOz8KLypOaWNvJ3MgY29kZSBiYXNlZCBvbiBpIGlzIHRoZSAicmVhbCBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUiCgkJCWlmICggbHR2cC0+bGVuIC0gNCA8IGkgKSByYyA9IEhDRl9FUlJfTEVOOwoJCQllbHNlIGx0dnAtPmxlbiA9IGkgKyA0OwoqLwovKiBSb2xhbmRzIGNvZGUgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCBhIE1TRiBzaG91bGQgbm90IGFzayBmb3IgbW9yZSB0aGFuIGlzIGF2YWlsYWJsZQoJCQkvLyBjaGVjayBpZiBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGV4Y2VlZHMgbWF4IGJ1ZmZlciBzaXplCgkJCWlmICggbHR2cC0+bGVuIC0gNCA+IGkgKSB7CgkJCQlyYyA9IEhDRl9FUlJfTEVOOwoJCQkJbHR2cC0+bGVuID0gaSArIDQ7CgkJCX0KKi8KCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBkYXRhIGZyb20gTklDIHZpYSBBVVggcG9ydCB0byBMVFYKCQkJY3AgPSAod2NpX2J1ZnApbHR2cC0+aG9zdF9hZGRyOwkJCQkJCS8qSU5fUE9SVF9TVFJJTkdfOF8xNiBtYWNybyBtYXkgbW9kaWZ5IGl0cyBwYXJhbWV0ZXJzKi8KCQkJaSA9IGx0dnAtPmxlbiAtIDQ7CgkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7CQkvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCS8vICQkIGNoYXIKCQkJCQkJCQkJCQkJCS8vLiAgZWxzZSAobm9uLWZpbmFsIHByb2dyYW1taW5nKQoJCX0gZWxzZQojZW5kaWYgLy87PyBhcyBsb25nIGFzIHRoZSBhYm92ZSBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKCQl7CQkJCQkJCQkJCQkvLy4gIC4gIGdldCBudW1iZXIgb2Ygd29yZHMgdG8gcHJvZ3JhbQoJCQlIQ0ZBU1NFUlQoIGx0dnAtPnNlZ21lbnRfc2l6ZSwgKmx0dnAtPmhvc3RfYWRkciApCgkJCWkgPSBsdHZwLT5zZWdtZW50X3NpemUvMjsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBkYXRhICh3b3JkcykgZnJvbSBMVFYgdmlhIEFVWCBwb3J0IHRvIE5JQwoJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7CQkJCQkJLy9PVVRfUE9SVF9TVFJJTkdfOF8xNiBtYWNybyBtYXkgbW9kaWZ5IGl0cyBwYXJhbWV0ZXJzCgkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIG1vZGUgPT0gdm9sYXRpbGUgcHJvZ3JhbW1pbmcKCQkJaWYgKCBsdHZwLT5tb2RlID09IENGR19QUk9HX1ZPTEFUSUxFICkgewoJCQkJCQkJCQkJCQkJLy8uICAuICAuICBzZXQgdXAgTklDIFJBTSBhZGRyZXNzYWJpbGl0eSB2aWEgQVVYIHBvcnQKCQkJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYgPDwgOSB8IChsdHZwLT5uaWNfYWRkciAmIDB4RkZGRikgPj4gNyApICk7CgkJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgJiAweDAwN0UpICk7CgkJCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgY3AsIGkgKTsJCS8vISEhV09SRCBsZW5ndGgsIGNwIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIKCQkJfQoJCX0KCX0KCWlmYnAtPklGQl9ETE1vZGUgPSBsdHZwLT5tb2RlOwkJCQkJLy9zYXZlIHN0YXRlIGluIElGQl9ETE1vZGUKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQoJSENGTE9HRVhJVCggSENGX1RSQUNFX0RMICkKCXJldHVybiByYzsKfSAvLyBkb3dubG9hZAoKCiNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBDZXJ0YWluIEhlcm1lcy1JSSBmaXJtd2FyZSB2ZXJzaW9ucyBjYW4gZ2VuZXJhdGUKKiBkZWJ1ZyBpbmZvcm1hdGlvbi4gVGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBpcwoqIGNvbnRhaW5lZCBpbiBhIGJ1ZmZlciBpbiBuaWMtUkFNLCBhbmQgY2FuIGJlIHJlYWQKKiB2aWEgdGhlIGF1eCBwb3J0LgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKZndfcHJpbnRmKElGQlAgaWZicCwgQ0ZHX0ZXX1BSSU5URl9TVFJDVCBGQVIgKmx0dnApCnsKICAgIGludCByYyA9IEhDRl9TVUNDRVNTOwogICAgaGNmXzE2IGZ3X2NudDsKLy8gICAgaGNmXzMyIERiTXNnQnVmZmVyID0gMHgyOUQyLCBEYk1zZ0NvdW50PSAweDAwMDAyOUQwOwovLyAgICBoY2ZfMTYgRGJNc2dTaXplPTB4MDAwMDAwODA7CiAgICBoY2ZfMzIgRGJNc2dCdWZmZXI7CiAgICBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCAqcCA9ICZpZmJwLT5JRkJfRndQZkJ1ZmY7CiAgICBsdHZwLT5sZW4gPSAxOwogICAgaWYgKCBwLT5EYk1zZ1NpemUgIT0gMCApIHsKICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhlIGNvdW50ZXIgaW4gbmljLVJBTSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGF0ZXN0IGNvdW50ZXIgdmFsdWUgb2YgdGhlIEhDRgogICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikocC0+RGJNc2dDb3VudCA+PiA3KSApOwogICAgICAgIE9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShwLT5EYk1zZ0NvdW50ICYgMHg3RSkgKTsKICAgICAgICBmd19jbnQgPSAoKElQVyggSFJFR19BVVhfREFUQSkgPj4xICkgJiAoKGhjZl8xNilwLT5EYk1zZ1NpemUgLSAxKSk7CiAgICAgICAgaWYgKCBmd19jbnQgIT0gaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKSB7Ci8vICAgIERiZ1ByaW50KCJmd19jbnQ9JWQgSUZCX0RiZ1ByaW50Rl9DbnQ9JWRcbiIsIGZ3X2NudCwgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQpOwogICAgICAgICAgICBEYk1zZ0J1ZmZlciA9IHAtPkRiTXNnQnVmZmVyICsgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKiA2OyAvLyBlYWNoIGVudHJ5IGlzIDMgd29yZHMKICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShEYk1zZ0J1ZmZlciA+PiA3KSApOwogICAgICAgICAgICBPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikoRGJNc2dCdWZmZXIgJiAweDdFKSApOwogICAgICAgICAgICBsdHZwLT5tc2dfaWQgICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOwogICAgICAgICAgICBsdHZwLT5tc2dfcGFyICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOwogICAgICAgICAgICBsdHZwLT5tc2dfdHN0YW1wID0gSVBXKEhSRUdfQVVYX0RBVEEpOwogICAgICAgICAgICBsdHZwLT5sZW4gPSA0OwogICAgICAgICAgICBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCsrOwogICAgICAgICAgICBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCAmPSAocC0+RGJNc2dTaXplIC0gMSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJjOwp9OwojZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaGNmXzE2IGdldF9maWQoIElGQlAgaWZicCApCiouUFVSUE9TRQkJZ2V0IGFsbG9jYXRlZCBGSUQgZm9yIGVpdGhlciB0cmFuc21pdCBvciBub3RpZnkuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKgkwCW5vIEZJRCBhdmFpbGFibGUKKgk8PjAJRklEIG51bWJlcgoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqCVRoZSBwcmVmZXJlbmNlIGlzIHRvIHVzZSBhICJwZW5kaW5nIiBhbGxvYy4gSWYgbm8gYWxsb2MgaXMgcGVuZGluZywgdGhlbiAtIGlmIGF2YWlsYWJsZSAtIHRoZSAic3BhcmUiIEZJRAoqCWlzIHVzZWQuCioJSWYgdGhlIHNwYXJlIEZJRCBpcyB1c2VkLCBJRkJfUnNjSW5kIChyZXByZXNlbnRpbmcgdGhlIHNwYXJlIEZJRCkgbXVzdCBiZSBjbGVhcmVkCioJSWYgdGhlIHBlbmRpbmcgYWxsb2MgaXMgdXNlZCwgdGhlIGFsbG9jIGV2ZW50IG11c3QgYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMuCioJSW4gY2FzZSB0aGUgc3BhcmUgRklEIHdhcyBkZXBsZXRlZCBhbmQgdGhlIElGQl9Sc2NJbmQgaGFzIGJlZW4gImZha2VkIiBhcyBwc2V1ZG8gcmVzb3VyY2Ugd2l0aCBhIDB4MDAwMQoqCXZhbHVlIGJ5IGhjZl9zZXJ2aWNlX25pYywgSUZCX1JzY0luZCBoYXMgdG8gYmUgImNvcnJlY3RlZCIgYWdhaW4gdG8gaXRzIDB4MDAwMCB2YWx1ZS4KKgoqCU5vdGUgdGhhdCBkdWUgdG8gdGhlIEhlcm1lcy1JSSBIL1cgcHJvYmxlbXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIHdvcmtlZCBhcm91bmQgYnkgREFXQSwgdGhlIEFsbG9jIGJpdAoqCWluIHRoZSBFdmVudCByZWdpc3RlciBpcyBubyBsb25nZXIgYSByZWxpYWJsZSBpbmRpY2F0aW9uIG9mIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIGEgRklELiBUaGUgIkNsZWFyIEZJRCIKKglwYXJ0IG9mIHRoZSBEQVdBIGxvZ2ljLCB0b2dldGhlciB3aXRoIHRoZSBjaG9pY2Ugb2YgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJldHVybiBpbmZvcm1hdGlvbiBmcm9tIGdldF9maWQsCioJaGFuZGxlIHRoaXMgYXV0b21hdGljYWxseSwgaS5lLiB3aXRob3V0IGFkZGl0aW9uYWwgY29kZSBpbiBnZXRfZmlkLgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBoY2ZfMTYKZ2V0X2ZpZCggSUZCUCBpZmJwICkKewoKaGNmXzE2IGZpZCA9IDA7CiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMApQUk9UX0NOVF9JTkkKI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKCglJRl9ETUEoIEhDRkFTU0VSVCghKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSksIGlmYnAtPklGQl9DbnRsT3B0KSApCgoJaWYgKCBJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0FMTE9DKSB7CgkJZmlkID0gSVBXKCBIUkVHX0FMTE9DX0ZJRCApOwoJCUhDRkFTU0VSVCggZmlkLCBpZmJwLT5JRkJfUnNjSW5kICkKCQlEQVdBX1pFUk9fRklEKCBIUkVHX0FMTE9DX0ZJRCApCiNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAoJCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgKSA9PSAwICk7CgkJSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApCiNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CgkJREFXQV9BQ0soIEhSRUdfRVZfQUxMT0MgKTsJCQkvLyEhbm90ZSB0aGF0IEhSRUdfRVZfQUxMT0MgaXMgd3JpdHRlbiBvbmx5IG9uY2UKLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMSApIHsKCQkJaWZicC0+SUZCX1JzY0luZCA9IDA7CgkJfQovLyNlbmRpZiAvLyBBTExPQ18xNQoJfSBlbHNlIHsKLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKCQlmaWQgPSBpZmJwLT5JRkJfUnNjSW5kOwovLyNlbmRpZiAvLyBBTExPQ18xNQoJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOwoJfQoJcmV0dXJuIGZpZDsKfSAvLyBnZXRfZmlkCiNlbmRpZiAvLyBIQ0ZfRExfT05MWQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQoqLlBVUlBPU0UJCXJlYWRzIHdpdGggMTYvMzIgYml0IEkvTyB2aWEgQkFQMSBwb3J0IGZyb20gTklDIFJBTSB0byBIb3N0IG1lbW9yeS4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgoqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKgl3b3JkX2xlbglCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIHJlYWQgYnkgdGhlIHByZXZpb3VzIGdldF9mcmFnIGFuZCBjb3B5IGxlbiAob3IgbGVuLTEpIGJ5dGVzIGZyb20KKiBOSUMgdG8gYnVmcC4KKiBPbiBhIEJpZyBFbmRpYW4gcGxhdGZvcm0sIHRoZSBwYXJhbWV0ZXIgd29yZF9sZW4gY29udHJvbHMgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHdob3NlIGVuZGlhbmVzcyBpcwoqIGNvbnZlcnRlZCAoaS5lLiBieXRlIHN3YXBwZWQpCioKKgoqLkRJQUdSQU0KKjEwOiBUaGUgUENNQ0lBIGNhcmQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdHJhbnNmZXIuIEJ5IGRlcG9zaXRpbmcgYSAibWFnaWMgbnVtYmVyIiBpbiB0aGUKKglIUkVHX1NXXzAgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBieSB2ZXJpZnlpbmcgdGhpcyByZWdpc3RlciwgaXQgY2FuIGJlCioJZGV0ZXJtaW5lZCB3aGV0aGVyIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuIFRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCBhY2NvcmRpbmdseS4KKglDbGVhcmluZyB0aGUgYnVmZmVyIGlzIGEgKHJlbGF0aXZlKSBjaGVhcCB3YXkgdG8gcHJldmVudCB0aGF0IGZhaWxpbmcgSS9PIHJlc3VsdHMgaW4gcnVuLWF3YXkgYmVoYXZpb3IKKgliZWNhdXNlIHRoZSBnYXJiYWdlIGluIHRoZSBidWZmZXIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciBpcnJlc3BlY3RpdmUgb2YgdGhlIHJldHVybiBzdGF0dXMgKGUuZy4KKgloY2Zfc2VydmljZV9uaWMgaGFzIHRoaXMgYmVoYXZpb3IpLgoqCiouTk9USUNFCioJSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKglBc3NlcnQgb24gbGVuIGlzIHBvc3NpYmxlCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQp7CmhjZl9pbwkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0RBVEFfMTsJLy9CQVAgZGF0YSByZWdpc3Rlcgp3Y2lfYnVmcAlwID0gYnVmcDsJCQkJCQkJCQkvL3dvcmtpbmcgcG9pbnRlcgppbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCmludAkJCWo7CgoJSENGQVNTRVJUKCAoKGhjZl8zMilidWZwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpYnVmcCApCgovKjE6CWhlcmUgcmVjb3ZlcnkgbG9naWMgZm9yIGludGVydmVuaW5nIEJBUCBhY2Nlc3MgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kIGhjZl9yY3ZfbXNnIENPVUxEIGJlIGFkZGVkCiAqIAlpZiBjdXJyZW50IGFjY2VzcyBpcyBSeEluaXRpYWwKICogCS4gIHBlcnNpc3RlbnRfb2Zmc2V0ICs9IGxlbgogKi8KCglpID0gbGVuOwoJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID4gMCBhbmQgY2FycnkgZnJvbSBwcmV2aW91cyBnZXRfZnJhZwoJaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeUluICkgewoJCQkJCQkJCQkJCQkJLy8uICBtb3ZlIGNhcnJ5IHRvIGJ1ZmZlcgoJCQkJCQkJCQkJCQkJLy8uICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCSpwKysgPSAoaGNmXzgpKGlmYnAtPklGQl9DYXJyeUluPj44KTsKCQlpLS07CgkJCQkJCQkJCQkJCQkvLy4gIGNsZWFyIGNhcnJ5IGZsYWcKCQlpZmJwLT5JRkJfQ2FycnlJbiA9IDA7Cgl9CiNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKCS8vc2tpcCB6ZXJvLWxlbmd0aCBJL08sIHNpbmdsZSBieXRlIEkvTyBhbmQgSS9PIG5vdCB3b3J0aHdoaWxlIChpLmUuIGxlc3MgdGhhbiA2IGJ5dGVzKWZvciBEVyBsb2dpYwoJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgewpoY2ZfMzIgRkFSCSpwNDsgLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCgkJaWYgKCAoIChoY2ZfMzIpcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCgkJCWlmICggKGhjZl8zMilwICYgMHgyICkgewkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAoJCQkJCQkJCQkJCQkJLy8uICAuICAuICByZWFkIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQkqKHdjaV9yZWNvcmRwKXAgPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJCXAgKz0gMjsKCQkJCWkgLT0gMjsKCQkJfQoJCQkJCQkJCQkJCQkJLy8uICAuICByZWFkIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKCQkJcDQgPSAoaGNmXzMyIEZBUiAqKXA7CgkJCWogPSBpLzQ7CgkJCUlOX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOwoJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQoJCQlwICs9IGkgJiB+MHgwMDAzOwoJCQlpICY9IDB4MDAwMzsKCQl9Cgl9CiNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCgkJCQkJCQkJCQkJCQkvL2lmIG5vIDMyLWJpdCBzdXBwb3J0IE9SIGJ5dGUgYWxpZ25lZCBPUiAxLTMgYnl0ZXMgbGVmdAoJaWYgKCBpICkgewoJCQkJCQkJCQkJCQkJLy8uICByZWFkIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQoJCWogPSBpLzI7CgkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgcCwgaiApOwoJCQkJCQkJCQkJCQkJLy8uICBpZiAxIGJ5dGUgbGVmdAoJCWlmICggaSAmIDB4MDAwMSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgcmVhZCAxIHdvcmQKCQkJaWZicC0+SUZCX0NhcnJ5SW4gPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgc3RvcmUgTFNCIGluIGxhc3QgY2hhciBvZiBidWZmZXIKCQkJYnVmcFtsZW4tMV0gPSAoaGNmXzgpaWZicC0+SUZCX0NhcnJ5SW47CgkJCQkJCQkJCQkJCQkvLy4gIC4gIHNhdmUgTVNCIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwoJCQlpZmJwLT5JRkJfQ2FycnlJbiB8PSAweDE7CgkJfQoJfQojaWYgSENGX0JJR19FTkRJQU4KCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICkKCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0UyKCB3b3JkX2xlbiwgbGVuICkgKQoJLy9zZWUgcHV0X2ZyYWcgZm9yIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uLCBidXQgYmUgY2FyZWZ1bGwgYWJvdXQgd2hhdCBhcmUgaW50J3MgYW5kIHdoYXQgYXJlCgkvL2hjZl8xNidzCglpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CmhjZl84IGM7CgkJYyA9IGJ1ZnBbMV07CQkJCQkJCQkvLy4gIC4gIGNvbnZlcnQgdGhlIDFzdCBoY2ZfMTYKCQlidWZwWzFdID0gYnVmcFswXTsKCQlidWZwWzBdID0gYzsKCQlpZiAoIHdvcmRfbGVuID4gMSApIHsJCQkJCQkvLy4gIC4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKCQkJYyA9IGJ1ZnBbM107CQkJCQkJCS8vLiAgLiAgLiAgY29udmVydCB0aGUgMm5kIGhjZl8xNgoJCQlidWZwWzNdID0gYnVmcFsyXTsKCQkJYnVmcFsyXSA9IGM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KfSAvLyBnZXRfZnJhZwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgaW5pdCggSUZCUCBpZmJwICkKKi5QVVJQT1NFCQlIYW5kbGVzIGNvbW1vbiBpbml0aWFsaXphdGlvbiBhc3BlY3RzIChILUkgaW5pdCwgY2FsaWJyYXRpb24sIGNvbmZpZy5tbmdtdCwgYWxsb2NhdGlvbikuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMKKglIQ0ZfRVJSX0lOQ09NUF9QUkkKKglIQ0ZfRVJSX0lOQ09NUF9GVwoqCUhDRl9FUlJfVElNRV9PVVQKKgk+PmhjZl9nZXRfaW5mbwoqCQlIQ0ZfRVJSX05PX05JQwoqCQlIQ0ZfRVJSX0xFTgoqCiouREVTQ1JJUFRJT04KKiBpbml0IHdpbGwgc3VjY2Vzc2l2ZWx5OgoqIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQwoqIC0gY2FsaWJyYXRlIHRoZSBTL1cgcHJvdGVjdGlvbiB0aW1lciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIKKiAtIGNvbGxlY3QgSFNJLCAiYWN0aXZlIiBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCiogLSBjaGVjayBIU0kgYW5kIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgU3RhdGlvbiBvciBBUCBGL1c6IGNoZWNrIFN0YXRpb24gb3IgQVAgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCiogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKKgoqCiouRElBR1JBTQoqMjoJZHJvcCBhbGwgZXJyb3Igc3RhdHVzIGJpdHMgaW4gSUZCX0NhcmRTdGF0IHNpbmNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHJlLWV2YWx1YXRlZC4KKjQ6CUFjayBldmVyeXRoaW5nIGV4Y2VwdCBIUkVHX0VWX1NMRUVQX1JFUS4gSXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZAoqCXZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgU2VuZCBDbWQgZXZlbnQgaXMgcGVuZGluZy4gQWNraW5nIEhSRUdfRVZfU0xFRVBfUkVRIGlzIGhhbmRsZWQgYnkgaGNmX2FjdGlvbigKKglIQ0ZfQUNUX0lOVF9PTiApICEhIQoqMTA6IENhbGlicmF0ZSB0aGUgUy9XIHRpbWUtb3V0IHByb3RlY3Rpb24gbWVjaGFuaXNtIGJ5IGNhbGxpbmcgY2FsaWJyYXRlKCkuIE5vdGUgdGhhdCBwb3NzaWJsZSBlcnJvcnMKKglpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCioJc3Vic2VxdWVudCBoY2YtY2FsbHMuCioxNDogdXNiX2NoZWNrX2NvbXAoKSBpcyBjYWxsZWQgdG8gaGF2ZSB0aGUgbWluaW1hbCB2aXN1YWwgY2x1dHRlciBmb3IgdGhlIGxlZ2FjeSBILUkgVVNCIGRvbmdsZQoqCWNvbXBhdGliaWxpdHkgY2hlY2suCioxNjogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDOgoqCSAtIEhTSSBzdXBwbGllcgoqCSAtIEYvVyBJZGVudGl0eQoqCSAtIEYvVyBzdXBwbGllcgoqCSBpZiBhcHByb3ByaWF0ZToKKgkgLSBQUkkgSWRlbnRpdHkKKgkgLSBQUkkgc3VwcGxpZXIKKgkgYXBwcm9wcmlhdGUgbWVhbnMgb24gSC1JOiBhbHdheXMKKgkgYW5kIG9uIEgtSUkgaWYgRi9XIHN1cHBsaWVyIHJlZmxlY3RzIGEgcHJpbWFyeSAoaS5lLiBvbmx5IGFmdGVyIGFuIEhlcm1lcyBSZXNldCBvciBJbml0CioJIGNvbW1hbmQpLgoqCSBRVUVTVElPTiA7PyAhISEhISEgc2hvdWxkLCBGb3IgZWFjaCBvZiB0aGUgYWJvdmUgUklEcyB0aGUgRW5kaWFuZXNzIGlzIGNvbnZlcnRlZCB0byBuYXRpdmUgRW5kaWFuZXNzLgoqCSBPbmx5IHRoZSByZXR1cm4gY29kZSBvZiB0aGUgZmlyc3QgaGNmX2dldF9pbmZvIGlzIHVzZWQuIEFsbCBoY2ZfZ2V0X2luZm8gY2FsbHMgYXJlIG1hZGUsIHJlZ2FyZGxlc3Mgb2YKKgkgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgMXN0IGhjZl9nZXRfaW5mby4gVGhlIGFzc3VtcHRpb25zIGFyZToKKgkgIC0gaWYgYW55IGNhbGwgZmFpbHMsIHRoZXkgYWxsIGZhaWwsIHNvIHJlbWVtYmVyaW5nIHRoZSByZXN1bHQgb2YgdGhlIDFzdCBjYWxsIGlzIGFkZXF1YXRlCioJICAtIGEgZmFpbGluZyBjYWxsIHdpbGwgb3ZlcndyaXRlIHRoZSBMLWZpZWxkIHdpdGggYSAweDAwMDAgdmFsdWUsIHdoaWNoIHNlcnZpY2VzIGJvdGggYXMgYW4KKgkJZXJyb3IgaW5kaWNhdGlvbiBmb3IgdGhlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIElGQiBhcyBtYWtpbmcgbW1kX2NoZWNrX2NvbXAgZmFpbC4KKgkgSW4gY2FzZSBvZiBILUksIHdoZW4gZ2V0dGluZyB0aGUgRi9XIGlkZW50aXR5IGZhaWxzLCB0aGUgRi9XIGlzIGFzc3VtZWQgdG8gYmUgSC1JIEFQIEYvVyBwcmUtZGF0aW5nCioJIHZlcnNpb24gOS4wIGFuZCB0aGUgRi9XIElkZW50aXR5IGFuZCBTdXBwbGllciBhcmUgZmFrZWQgYWNjb3JkaW5nbHkuCioJIEluIGNhc2Ugb2YgSC1JSSwgdGhlIFByaW1hcnksIFN0YXRpb24gYW5kIEFQIElkZW50aXR5IGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBGL1cgSWRlbnRpdHkuCioJIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIFN1cHBsaWVyIGluZm9ybWF0aW9uLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBQUkkgaW5mb3JtYXRpb24gY2FuIG5vIGxvbmdlciBiZQoqCSByZXRyaWV2ZWQgd2hlbiBhIFRlcnRpYXJ5IHJ1bnMuIFRvIGFjY29tbW9kYXRlIE1TRnMgYW5kIFV0aWxpdGllcyB3aG8gZGVwZW5kIG9uIFBSSSBpbmZvcm1hdGlvbiBiZWluZwoqCSBhdmFpbGFibGUgYXQgYW55IHRpbWUsIHRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIGluIHRoZSBJRkIuIEluIHRoaXMgY2FjaGUgdGhlIGdlbmVyaWMgIkYvVyIgdmFsdWUgb2YKKgkgdGhlIHR5cC1maWVsZHMgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgc3BlY2lmaWMgKGxlZ2FjeSkgIlBSSSIgdmFsdWVzLiBUbyBhY3R1YWxseSByZS1yb3V0ZSB0aGUgKGxlZ2FjeSkKKgkgUFJJIHJlcXVlc3QgdmlhIGhjZl9nZXRfaW5mbywgdGhlIHh4eHgtdGFibGUgbXVzdCBiZSBzZXQuICBJbiBjYXNlIG9mIEgtSSwgdGhpcyBjYWNoaW5nLCBtb2RpZnlpbmcgYW5kCioJIHJlLXJvdXRpbmcgaXMgbm90IG5lZWRlZCBiZWNhdXNlIFBSSSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIE5JQy4gRm9yCioJIGNvbnNpc3RlbmN5IHRoZSBjYWNoaW5nIGZpZWxkcyBpbiB0aGUgSUZCIGFyZSBmaWxsZWQgd2l0aCB0aGUgUFJJIGluZm9ybWF0aW9uIGFueXdheS4KKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCioJUHJpbWFyeSBGaXJtd2FyZSBWYXJpYW50IGFuZCBSYW5nZSBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhpcyBIQ0YuICBJZiBlaXRoZXIgb2YKKgl0aGVzZSB0ZXN0cyBmYWlscywgdGhlIENBUkRfU1RBVF9JTkNPTVBfUFJJIGJpdCBvZiBJRkJfQ2FyZFN0YXQgaXMgc2V0CioJTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQoqCXVuc3VpdGFibGUgZm9yIG1hbnVmYWN0dXJpbmcgdGVzdCBzeXN0ZW1zIGxpa2UgdGhlIEZUUy4gVGhpcyBjYW4gYmUgcmVtZWRpZWQgYnkgYW4gYWRkaW5nIGEgdGVzdCBsaWtlCioJaWZicC0+SUZCX1BSSVN1cC5pZCA9PSBDT01QX0lEX1BSSQoqMjA6IEluIGNhc2UgdGhlcmUgaXMgVGVydGlhcnkgRi9XIGFuZCB0aGlzIEYvVyBpcyBTdGF0aW9uIEYvVywgdGhlIFN1cHBsaWVyIFZhcmlhbnQgYW5kIFJhbmdlIG9mIHRoZSBTdGF0aW9uCioJRmlybXdhcmUgZnVuY3Rpb24gYXMgcmV0cmlldmVkIGZyb20gdGhlIEhlcm1lcyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIFRvcCBhbmQgQm90dG9tIGxldmVsIHN1cHBvcnRlZCBieQoqCXRoaXMgSENGLgoqCU5vdGU6IDs/IHRoZSB0ZXJ0aWFyeSBGL1cgY29tcGF0aWJpbGl0eSBjaGVja3MgY291bGQgYmUgbW92ZWQgdG8gdGhlIERIRiwgd2hpY2ggYWxyZWFkeSBoYXMgY2hlY2tlZCB0aGUKKglDRkkgYW5kIE1GSSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBOSUMgYmVmb3JlIHRoZSBpbWFnZSB3YXMgZG93bmxvYWRlZC4KKjI4OiBJbiBjYXNlIG9mIG5vbi1QcmltYXJ5IEYvVzogYWxsb2NhdGVzIGFuZCBhY2tub3dsZWRnZSBhIChUWCBvciBOb3RpZnkpIEZJRCBhbmQgYWxsb2NhdGVzIHdpdGhvdXQKKglhY2tub3dsZWRnZSBhbm90aGVyIChUWCBvciBOb3RpZnkpIEZJRCAodGhlIHNvLWNhbGxlZCAxLjUgYWxsb2Mgc2NoZW1lKSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6CioJLSBleGVjdXRlIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGJ5IGNhbGxpbmcgY21kX2V4ZQoqCS0gd2FpdCB0aWxsIGVpdGhlciB0aGUgYWxsb2MgZXZlbnQgb3IgYSB0aW1lLW91dCBvY2N1cnMKKgktIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgYWxsb2MgZXZlbnQgb2NjdXJzLCBjYWxsIGdldF9maWQgdG8KKgkgIC0gcmVhZCB0aGUgRklEIGFuZCBzYXZlIGl0IGluIElGQl9Sc2NJbmQgdG8gYmUgdXNlZCBhcyAic3BhcmUgRklEIgoqCSAgLSBhY2tub3dsZWRnZSB0aGUgYWxsb2MgZXZlbnQKKgkgIC0gZG8gYW5vdGhlciAiaGFsZiIgYWxsb2NhdGUgdG8gY29tcGxldGUgdGhlICIxLjUgQWxsb2Mgc2NoZW1lIgoqCSAgTm90ZSB0aGF0IGFib3ZlIDMgc3RlcHMgZG8gbm90IGhhcm0gYW5kIHRodXMgZ2l2ZSB0aGUgImNoZWFwZXN0IiBhY2NlcHRhYmxlIHN0cmF0ZWd5LgoqCSAgSWYgYSB0aW1lLW91dCBvY2N1cnJlZCwgdGhlbiByZXBvcnQgdGltZSBvdXQgc3RhdHVzIChhZnRlciBhbGwpCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgaW50CmluaXQoIElGQlAgaWZicCApCnsKCmludAlyYyA9IEhDRl9TVUNDRVNTOwoKCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfSU5JVCwgMCApCgoJaWZicC0+SUZCX0NhcmRTdGF0ID0gMDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogMiovCglPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsgCQkJCQkJCQkJCQkvKiA0Ki8KCUlGX1BST1RfVElNRSggY2FsaWJyYXRlKCBpZmJwICk7ICkgCQkJCQkJCQkJCQkJCS8qMTAqLwojaWYgMCAvLyBPT1IKCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IDI7CQkJCQkJCS8vbWlzdXNlIHRoZSBJRkIgc3BhY2UgZm9yIGEgcHV0CglpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfVElDS19USU1FOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9ICgxMDAwKjEwMDApLzEwMjQgKyAxOwkvL3JvdWdobHkgMSBzZWNvbmQKCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOwojZW5kaWYgLy8gT09SCglpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSBzaXplb2YoQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CglpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfRldfSURFTlRJVFk7CglyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOwovKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLwojaWYgSENGX0JJR19FTkRJQU4KCWlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICk7CglpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmFyaWFudCApOwoJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKTsKCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yICk7CiNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgojaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECQkJCQkJCQkJCQkJCQkJCQkJLyoxNCovCglpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewkJCQkJCQkJCQkJCQkJCQkJCS8qMTYqLwoJCWlmYnAtPklGQl9IU0lTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCQlpZmJwLT5JRkJfSFNJU3VwLnR5cCA9IENGR19OSUNfSFNJX1NVUF9SQU5HRTsKCQlyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9IU0lTdXAubGVuICk7Ci8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICwgQlVUIGFjY29yZGluZyB0byBhIHJlcG9ydCBvZiBhIEJFLXVzZXIgaXQgaXMKICogc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBXQVJQIHJlbGVhc2UKICogc2luY2Ugc29tZSBjb21waWxlcnMgbWFrZSB1Z2x5IGJ1dCB1bm5lY2Vzc2FyeSBjb2RlIG9mIHRoZXNlIGluc3RydWN0aW9ucyBldmVuIGZvciBMRSwKICogaXQgaXMgY29uZGl0aW9uYWxseSBjb21waWxlZCAqLwojaWYgSENGX0JJR19FTkRJQU4KCQlpZmJwLT5JRkJfSFNJU3VwLnJvbGUgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnJvbGUgKTsKCQlpZmJwLT5JRkJfSFNJU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLmlkICk7CgkJaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ICk7CgkJaWZicC0+SUZCX0hTSVN1cC5ib3R0b20gID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5ib3R0b20gKTsKCQlpZmJwLT5JRkJfSFNJU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfSFNJU3VwLnRvcCApOwojZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KCQlpZmJwLT5JRkJfRldTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKCQlpZmJwLT5JRkJfRldTdXAudHlwID0gQ0ZHX0ZXX1NVUF9SQU5HRTsKCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldTdXAubGVuICk7Ci8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICovCiNpZiBIQ0ZfQklHX0VORElBTgoJCWlmYnAtPklGQl9GV1N1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnJvbGUgKTsKCQlpZmJwLT5JRkJfRldTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5pZCApOwoJCWlmYnAtPklGQl9GV1N1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgKTsKCQlpZmJwLT5JRkJfRldTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5ib3R0b20gKTsKCQlpZmJwLT5JRkJfRldTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC50b3AgKTsKI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCgoJCWlmICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfUFJJICkgewkJCQkJCQkJCQkJCS8qIDIwKi8KaW50IGkgPSBzaXplb2YoIENGR19GV19JREVOVElUWV9TVFJDVCkgKyBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCApOwoJCQl3aGlsZSAoIGktLSApICgoaGNmXzgqKSgmaWZicC0+SUZCX1BSSUlkZW50aXR5KSlbaV0gPSAoKGhjZl84KikoJmlmYnAtPklGQl9GV0lkZW50aXR5KSlbaV07CgkJCWlmYnAtPklGQl9QUklJZGVudGl0eS50eXAgPSBDRkdfUFJJX0lERU5USVRZOwoJCQlpZmJwLT5JRkJfUFJJU3VwLnR5cCA9IENGR19QUklfU1VQX1JBTkdFOwoJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSAmaWZicC0+SUZCX1BSSUlkZW50aXR5LmxlbjsKCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSAmaWZicC0+SUZCX1BSSVN1cC5sZW47CgkJfQoJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKQkJCQkgLyogMjIqLwojaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAovLzs/IHRoZSBQUkkgY29tcGF0aWJpbGl0eSBjaGVjayBpcyBvbmx5IHJlbGV2YW50IGZvciBESEYKCQkJIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAoJCSAgICkgewoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgPSBDQVJEX1NUQVRfSU5DT01QX1BSSTsKCQkJcmMgPSBIQ0ZfRVJSX0lOQ09NUF9QUkk7CgkJfQoJCWlmICggKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9TVEEgJiYJIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEsICZpZmJwLT5JRkJfRldTdXApICkgfHwKCQkJICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfQVBGICYmICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmLCAmaWZicC0+SUZCX0ZXU3VwKSApCgkJICAgKSB7CQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjQgKi8KCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CgkJCXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CgkJfQoJfQojZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDI4ICovCglpZiAoIHJjID09IEhDRl9TVUNDRVNTICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPj0gQ09NUF9JRF9GV19TVEEgKSB7ClBST1RfQ05UX0lOSQoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoJCSogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCgkJKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSByaWdodCBzcG90IGluIHRoZSBIQ0YsIHRoaW5raW5nIGFib3V0IGhjZl9lbmFibGUuLi4KCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKLy8JCWlmYnAtPklGQl9Sc2NJbmQgPSAxOwkvL2xldCdzIGhvcGUgdGhhdCBieSB0aGUgdGltZSBoY2Zfc2VuZF9tc2cgaXNhIGNhbGxlZCwgdGhlcmUgd2lsbCBiZSBhIEZJRAovLyNlbHNlCgkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BTExPQykgPT0gMCApOwoJCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVChwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApIC8qTk9QKi87KQojaWYgSENGX0RNQQoJCQlpZiAoICEgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApCiNlbmRpZiAvLyBIQ0ZfRE1BCgkJCXsKCQkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CgkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQsIDAgKQoJCQkJY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwoJCQkJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ID09IDAgKSByYyA9IEhDRl9FUlJfVElNRV9PVVQ7ICkKCQkJfQoJCX0KLy8jZW5kaWYgLy8gQUxMT0NfMTUKCX0KI2VuZGlmIC8vIEhDRl9ETF9PTkxZCglIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCglIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfSU5JVCApCglyZXR1cm4gcmM7Cn0gLy8gaW5pdAoKI2lmIChIQ0ZfRExfT05MWSkgPT0gMAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgaXNyX2luZm8oIElGQlAgaWZicCApCiouUFVSUE9TRQkJaGFuZGxlcyBsaW5rIGV2ZW50cy4KKgoqLkFSR1VNRU5UUwoqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawoqCiouUkVUVVJOUwkJTi5BLgoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqMToJRmlyc3QgdGhlIEZJRCBudW1iZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBJbmZvRXZlbnQgaXMgZGV0ZXJtaW5lZC4KKglOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgoqCU5leHQgdGhlIEwtZmllbGQgYW5kIHRoZSBULWZpZWxkIGFyZSBmZXRjaGVkIGludG8gc2NyYXRjaCBidWZmZXIgaW5mby4KKjI6CUluIGNhc2Ugb2YgdGFsbGllcywgdGhlIDE2IGJpdHMgSGVybWVzIHZhbHVlcyBhcmUgYWNjdW11bGF0ZWQgaW4gdGhlIElGQiBpbnRvIDMyIGJpdHMgdmFsdWVzLiBJbmZvWzBdCioJaXMgKGV4cGVjdGVkIHRvIGJlKSBIQ0ZfTklDX1RBTF9DTlQgKyAxLiBUaGUgY29udHJhcHRpb24gIndoaWxlICggaW5mb1swXS0tID4xICkiIHJhdGhlciB0aGFuCioJIndoaWxlICggLS1pbmZvWzBdICkiIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyBkYW5nZXJvdXMgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFZhbHVlIGZpZWxkIGJ5CioJZGVjcmVtZW50aW5nIGluZm9bMF0uIEFzIGEgcmVzdWx0IG9mIGEgYnVnIGluIHNvbWUgdmVyc2lvbiBvZiB0aGUgRi9XLCBpbmZvWzBdIG1heSBiZSAwLCByZXN1bHRpbmcKKglpbiBhIHZlcnkgbG9uZyBsb29wIGluIHRoZSBwcmUtZGVjcmVtZW50IGxvZ2ljLgoqNDoJSW4gY2FzZSBvZiBhIGxpbmsgc3RhdHVzIGZyYW1lLCB0aGUgaW5mb3JtYXRpb24gaXMgY29waWVkIHRvIHRoZSBJRkIgZmllbGQgSUZCX2xpbmtTdGF0Cio2OglBbGwgb3RoZXIgdGhhbiBUYWxsaWVzIChpbmNsdWRpbmcgInVua25vd24iIG9uZXMpIGFyZSBjaGVja2VkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhlIE1TRgoqCXZpYSBDRkdfUklEX0xPRy4gSWYgYSBtYXRjaCBpcyBmb3VuZCBvciB0aGUgc2VsZWN0aW9uIHNldCBoYXMgdGhlIHdpbGQtY2FyZCB0eXBlIChpLmUgbm9uLU5VTEwgYnVmZmVyCioJcG9pbnRlciBhdCB0aGUgdGVybWluYXRpbmcgemVyby10eXBlKSwgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgKHR5cGUtc3BlY2lmaWMpIGxvZyBidWZmZXIuCioJTm90ZSB0aGF0IHRvIGFjY3VtdWxhdGUgdGFsbGllcyBpbnRvIElGQiBBTkQgdG8gbG9nIHRoZW0gb3IgdG8gbG9nIGEgZnJhbWUgd2hlbiBhIHNwZWNpZmljIG1hdGNoIG9jY3VyZXMKKglBTkQgYmFzZWQgb24gdGhlIHdpbGQtY2FyZCBzZWxlY3Rpb24sIHlvdSBoYXZlIHRvIGNhbGwgc2V0dXBfYmFwIGFnYWluIGFmdGVyIHRoZSAxc3QgY29weS4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCmlzcl9pbmZvKCBJRkJQIGlmYnAgKQp7CmhjZl8xNglpbmZvWzJdLCBmaWQ7CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HClJJRF9MT0dQCXJpZHAgPSBpZmJwLT5JRkJfUklETG9ncDsJLy9OVUxMIG9yIHBvaW50ZXIgdG8gYXJyYXkgb2YgUklEX0xPRyBzdHJ1Y3R1cmVzICh0ZXJtaW5hdGVkIGJ5IHplcm8gdHlwKQojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoKCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gKTsJCQkJCQkJCQkJCQkJCQkJLyogMSAqLwoJZmlkID0gSVBXKCBIUkVHX0lORk9fRklEICk7CglEQVdBX1pFUk9fRklEKCBIUkVHX0lORk9fRklEICkKCWlmICggZmlkICkgewoJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAwLCBJT19JTiApOwoJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaW5mbywgNCBCRV9QQVIoMikgKTsKCQlIQ0ZBU1NFUlQoIGluZm9bMF0gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBpbmZvWzFdLCBpbmZvWzBdICkgKSAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQojaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX05JQwkJLy9IZXJtZXMgdGFsbHkgc3VwcG9ydAoJCWlmICggaW5mb1sxXSA9PSBDRkdfVEFMTElFUyApIHsKaGNmXzMyCSpwOwovKjIqLwkJaWYgKCBpbmZvWzBdID4gSENGX05JQ19UQUxfQ05UICkgewoJCQkJaW5mb1swXSA9IEhDRl9OSUNfVEFMX0NOVCArIDE7CgkJCX0KCQkJcCA9IChoY2ZfMzIqKSZpZmJwLT5JRkJfTklDX1RhbGxpZXM7CgkJCXdoaWxlICggaW5mb1swXS0tID4xICkgKnArKyArPSBJUFcoIEhSRUdfREFUQV8xICk7CS8vcmVxdWVzdCBtYXkgcmV0dXJuIHplcm8gbGVuZ3RoCgkJfQoJCWVsc2UKI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQwoJCXsKLyo0Ki8JCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgewoJCQkJaWZicC0+SUZCX0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApOwoJCQl9CiNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCi8qNiovCQl3aGlsZSAoIDEgKSB7CgkJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgewoJCQkJCWlmICggcmlkcC0+YnVmcCApIHsKCQkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAJLy9zYXZlIEwKCQkJCQkJcmlkcC0+YnVmcFsxXSA9IGluZm9bMV07CQkJCQkJLy9zYXZlIFQKCQkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsyXSwgKHJpZHAtPmJ1ZnBbMF0gLSAxKSoyIEJFX1BBUigwKSApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCX0KCQkJCXJpZHArKzsKCQkJfQojZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwoJCX0KCQlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPIHwgSENGX1RSQUNFX0VYSVQgKTsKCX0KCXJldHVybjsKfSAvLyBpc3JfaW5mbwojZW5kaWYgLy8gSENGX0RMX09OTFkKCi8vCi8vCi8vICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKLy8gLyo0Ki8JaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7Ci8vIAkJCWlmYnAtPklGQl9EU0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApIHwgQ0ZHX0xJTktfU1RBVF9DSEFOR0U7CS8vY29ycnVwdHMgQkFQICEhIDs/Ci8vIAkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKLy8gCQkJcHJpbnRrKCAiPDQ+bGlua3N0YXR1czogJTA0eFxuIiwgaWZicC0+SUZCX0RTTGlua1N0YXQgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwovLyAJCQlpZiAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7IAkvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgovLyAJCQkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOwkJCQkvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKLy8gCQkJCXByaW50ayggIjw1Pmlzcl9pbmZvOiBBd2FpdENvbm5lY3Rpb24gcGhhc2Ugc3RhcnRlZCwgSUZCX1RpY2tDbnQgPSAwXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5Ci8vIAkJCX0KLy8gI2VuZGlmIC8vIEhDRl9ERFMKLy8gCQl9Ci8vICNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCi8vIC8qNiovCXdoaWxlICggMSApIHsKLy8gCQkJaWYgKCByaWRwLT50eXAgPT0gMCB8fCByaWRwLT50eXAgPT0gaW5mb1sxXSApIHsKLy8gCQkJCWlmICggcmlkcC0+YnVmcCApIHsKLy8gCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQovLyAJCQkJCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAyLCBJT19JTiApOwkJCS8vcmVzdG9yZSBCQVAgZm9yIHRhbGxpZXMsIGxpbmtzdGF0IGFuZCBzcGVjaWZpYyB0eXBlIGZvbGxvd2VkIGJ5IHdpbGQgY2FyZAovLyAJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oIHJpZHAtPmxlbiAtIDEsIGluZm9bMF0gKTsgCS8vc2F2ZSBMCi8vIAkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsxXSwgcmlkcC0+YnVmcFswXSoyIEJFX1BBUigwKSApOwovLyAJCQkJfQovLyAJCQkJYnJlYWs7IC8vOz90aGlzIGJyZWFrIGlzIG5vIGxvbmdlciBuZWVkZWQgZHVlIHRvIHNldHVwX2JhcCBidXQgbGV0cyBjb25jZW50cmF0ZSBvbiBERFMgZmlyc3QKLy8gCQkJfQovLyAJCQlyaWRwKys7Ci8vIAkJfQovLyAjZW5kaWYgLy8gSENGX0VYVF9JTkZPX0xPRwovLyAJfQovLyAJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7Ci8vCi8vCi8vCi8vCi8vCXJldHVybjsKLy99IC8vIGlzcl9pbmZvCi8vI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQl2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCiouUFVSUE9TRQkJZmlsdGVycyBhc3NlcnQgb24gbGV2ZWwgYW5kIGludGVyZmFjZXMgdG8gdGhlIE1TRiBzdXBwbGllZCBtc2ZfYXNzZXJ0IHJvdXRpbmUuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglsaW5lX251bWJlcglsaW5lIG51bWJlciBvZiB0aGUgbGluZSB3aGljaCBjYXVzZWQgdGhlIGFzc2VydAoqCXEJCQlxdWFsaWZpZXIsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGdpdmUgYSBjbHVlIGFib3V0IHRoZSBwcm9ibGVtCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqCioKKi5ESUFHUkFNCioKKi5OT1RJQ0UKKiBtZGRfYXNzZXJ0IGhhcyBiZWVuIHRocm91Z2ggYSB0dXJtb2lsLCByZW5hbWluZyBoY2ZfYXNzZXJ0IHRvIGFzc2VydCBhbmQgaGNmX2Fzc2VydCBhZ2FpbiBhbmQgc3VwcG9ydGluZyBvZmYKKiBhbmQgb24gYmVpbmcgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCBhbmQgb3RoZXIgKCBpbW1hdHVyZSApIE1vZHVsYXJEcml2ZXJEZXZlbG9wbWVudCBtb2R1bGVzIGxpa2UgREhGIGFuZAoqIE1NRC4KICogISEhISBUaGUgYXNzZXJ0IHJvdXRpbmUgaXMgbm90IGFuIGhjZl8uLi4uLiByb3V0aW5lIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1heSBiZSBjYWxsZWQgYnkgdGhlIE1TRiwKICoJCWhvd2V2ZXIgaXQgaXMgY2FsbGVkIGZyb20gbW1kLmMgYW5kIGRoZi5jLCBzbyBpdCBtdXN0IGJlIGV4dGVybmFsLgogKgkJVG8gcHJldmVudCBuYW1lc3BhY2UgcG9sbHV0aW9uIGl0IG5lZWRzIGEgcHJlZml4LCB0byBwcmV2ZW50IHRoYXQgTVNGIHByb2dyYW1tZXJzIHRoaW5rIHRoYXQKICoJCXRoZXkgYXJlIGFsbG93ZWQgdG8gY2FsbCB0aGUgYXNzZXJ0IGxvZ2ljLCB0aGUgcHJlZml4IEhDRiBjYW4ndCBiZSB1c2VkLCBzbyBNREQgaXMgc2VsZWN0ZWQhISEhCiAqCiogV2hlbiBjYWxsZWQgZnJvbSB0aGUgREhGIG1vZHVsZSB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYnkgREhGX0ZJTEVfTkFNRV9PRkZTRVQgYW5kIHdoZW4gY2FsbGVkIGZyb20KKiB0aGUgTU1EIG1vZHVsZSBieSBNTURfRklMRV9OQU1FX09GRlNFVC4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIEhDRl9BU1NFUlQKdm9pZAptZGRfYXNzZXJ0KCBJRkJQIGlmYnAsIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzMyIHEgKQp7CmhjZl8xNglydW5fdGltZV9mbGFnID0gaWZicC0+SUZCX0Fzc2VydEx2bDsKCglpZiAoIHJ1bl90aW1lX2ZsYWcgLyogPiA7Pz8/Pz8/ICovICkgeyAvL3ByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yLCBsYXRlciB0byBiZSBleHRlbmRlZCB0byBsZXZlbCBmaWx0ZXJpbmcKCQlpZmJwLT5JRkJfQXNzZXJ0UXVhbGlmaWVyID0gcTsKCQlpZmJwLT5JRkJfQXNzZXJ0TGluZSA9IChoY2ZfMTYpbGluZV9udW1iZXI7CiNpZiAoSENGX0FTU0VSVCkgJiAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gKQoJCWlmICggaWZicC0+SUZCX0Fzc2VydFJ0biApIHsKCQkJaWZicC0+SUZCX0Fzc2VydFJ0biggbGluZV9udW1iZXIsIGlmYnAtPklGQl9Bc3NlcnRUcmFjZSwgcSApOwoJCX0KI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfU1dfU1VQCgkJT1BXKCBIUkVHX1NXXzIsIGxpbmVfbnVtYmVyICk7CgkJT1BXKCBIUkVHX1NXXzIsIGlmYnAtPklGQl9Bc3NlcnRUcmFjZSApOwoJCU9QVyggSFJFR19TV18yLCAoaGNmXzE2KXEgKTsKCQlPUFcoIEhSRUdfU1dfMiwgKGhjZl8xNikocSA+PiAxNiApICk7CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1NXX1NVUAoKI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgJiYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgoJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAwOwkJCQkJCQkJCS8vIHByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yCgkJaGNmX3B1dF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0Fzc2VydFN0cmN0ICk7CgkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IHJ1bl90aW1lX2ZsYWc7CQkJCQkJLy8gcmVzdG9yZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGV2ZWwKI2VuZGlmIC8vIEhDRl9FWFRfTUIgLyBIQ0ZfQVNTRVJUX01CCgl9Cn0gLy8gbWRkX2Fzc2VydAojZW5kaWYgLy8gSENGX0FTU0VSVAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQoqLlBVUlBPU0UJCXdyaXRlcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIEhvc3QgbWVtb3J5IHRvIE5JQyBSQU0uCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCioJd29yZF9sZW4JQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCioKKi5SRVRVUk5TCQlOLkEuCioKKi5ERVNDUklQVElPTgoqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSBub3QgeWV0IHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHB1dF9mcmFnIGFuZCBjb3B5IGxlbgoqIChvciBsZW4tMSkgYnl0ZXMgZnJvbSBidWZwIHRvIE5JQy4KKgoqCiouRElBR1JBTQoqCiouTk9USUNFCioJSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKglBc3NlcnQgb24gbGVuIGlzIHBvc3NpYmxlCioKKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkhDRl9TVEFUSUMgdm9pZApwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQp7CmhjZl9pbwkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0RBVEFfMTsJLy9CQVAgZGF0YSByZWdpc3RlcgppbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCmhjZl8xNgkJajsKCUhDRkFTU0VSVCggKChoY2ZfMzIpYnVmcCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQojaWYgSENGX0JJR19FTkRJQU4KCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICkKCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCglIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0VfMiggd29yZF9sZW4sIGxlbiApICkKCglpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJCS8vaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydAogCQkJCQkJCQkJCQkJCQkvLy4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAxc3QgaGNmXzE2CgkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OwoJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKCQkJCQkJCQkJCQkJCQkvLy4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CgkJbGVuIC09IDI7CgkJYnVmcCArPSAyOwoJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCQkvLy4gIGlmIHRoZXJlIGlzIHRvIGNvbnZlcnQgbW9yZSB0aGFuIDEgd29yZCAoIGkuZSAyICkKIAkJCQkJCQkJCQkJCQkJLy8uICAuICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMm5kIGhjZl8xNgoJCQlqID0gYnVmcFsxXSB8IGJ1ZnBbMF08PDg7CS8qYnVmcCBpcyBhbHJlYWR5IGluY3JlbWVudGVkIGJ5IDIqLwoJCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJCQkJCQkJCQkJCQkJLy8uICAuICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQoJCQlsZW4gLT0gMjsKCQkJYnVmcCArPSAyOwoJCX0KCX0KI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCglpID0gbGVuOwoJaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeU91dCApIHsJCQkJCS8vc2tpcCB6ZXJvLWxlbmd0aAoJCWogPSAoKCpidWZwKTw8OCkgKyAoIGlmYnAtPklGQl9DYXJyeU91dCAmIDB4RkYgKTsKCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJYnVmcCsrOyBpLS07CgkJaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKCX0KI2lmIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUwoJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCgkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAoJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFXzE2QklUKSAmJiBpID49IDYgKSB7CmhjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KCQlpZiAoICggKGhjZl8zMilidWZwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKCQkJaWYgKCAoaGNmXzMyKWJ1ZnAgJiAweDIgKSB7CQkJCS8vLiAgLiAgaWYgYnVmZmVyIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLy8uICAuICAuICB3cml0ZSBhIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCgkJCQlqID0gKih3Y2lfcmVjb3JkcClidWZwOwkJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CgkJCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CgkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CgkJCQlidWZwICs9IDI7IGkgLT0gMjsKCQkJfQoJCQkJCQkJCQkJCQkJLy8uICAuICB3cml0ZSBhcyBtYW55IGRvdWJsZSB3b3JkIGFzIHBvc3NpYmxlCgkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOwoJCQlqID0gKGhjZl8xNilpLzQ7CgkJCU9VVF9QT1JUX1NUUklOR18zMiggaW9fcG9ydCwgcDQsIGogKTsKCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKCQkJYnVmcCArPSBpICYgfjB4MDAwMzsKCQkJaSAmPSAweDAwMDM7CgkJfQoJfQojZW5kaWYgLy8gSENGX0lPXzMyQklUUwoJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMSB3b3JkIGxlZnQKCWlmICggaSApIHsKCQkJCQkJCQkJCQkJCS8vLiAgaWYgb2RkIG51bWJlciBvZiBieXRlcyBsZWZ0CgkJaWYgKCBpICYgMHgwMDAxICkgewoJCQkJCQkJCQkJCQkJLy8uICAuICBzYXZlIGxlZnQgb3ZlciBieXRlIChiZWZvcmUgYnVmcCBpcyBjb3JydXB0ZWQpIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwoJCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAoaGNmXzE2KWJ1ZnBbaS0xXSB8IDB4MDEwMDsJLy9ub3RlIHRoYXQgaSBhbmQgYnVmcCBhcmUgYWx3YXlzIHNpbXVsdGFuZW91c2x5IG1vZGlmaWVkLCAmYnVmcFtpLTFdIGlzIGludmFyaWFudAoJCX0KCQkJCQkJCQkJCQkJCS8vLiAgd3JpdGUgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CgkJaiA9IChoY2ZfMTYpaS8yOwoJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7Cgl9Cn0gLy8gcHV0X2ZyYWcKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKi5TVUJNT0RVTEUJCXZvaWQgcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCiouUFVSUE9TRQkJY2xlYW51cCBhZnRlciBwdXRfZnJhZyBmb3IgdHJhaWxpbmcgb2RkIGJ5dGUgYW5kIE1JQyB0cmFuc2ZlciB0byBOSUMuCioKKi5BUkdVTUVOVFMKKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKgoqLlJFVFVSTlMJCU4uQS4KKgoqLkRFU0NSSVBUSU9OCiogZmluYWxpemUgdGhlIE1JQyBjYWxjdWxhdGlvbiB3aXRoIHRoZSBwYWRkaW5nIHBhdHRlcm4sIG91dHB1dCB0aGUgbGFzdCBieXRlIChpZiBhcHBsaWNhYmxlKQoqIG9mIHRoZSBtZXNzYWdlIGFuZCB0aGUgTUlDIHRvIHRoZSBUeEZTCioKKgoqLkRJQUdSQU0KKjI6CTEgYnl0ZSBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX0NhcnJ5T3V0ICggdGhlIHB1dF9mcmFnIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgoqCTEgLSAzIGJ5dGVzIG9mIHRoZSBsYXN0IHB1dF9mcmFnIG1heSBiZSBzdGlsbCBpbiBJRkJfdHhfMzIgKCB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KKglUaGUgY2FsbCB0byB0aGUgTUlDIGNhbGN1bGF0aW9uIHJvdXRpbmUgZmVlZHMgdGhlc2UgcmVtYWluaW5nIGJ5dGVzIChpZiBhbnkpIG9mIHB1dF9mcmFnIGFuZCB0aGUKKglqdXN0IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHBhZGRpbmcgYXMgbmVlZGVkIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lLiBOb3RlIHRoYXQgdGhlICJ1bm5lZWRlZCIgcGFkCioJYnl0ZXMgc2ltcGx5IGVuZCB1cCBpbiB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgYW5kIGFyZSBuZXZlciB1c2VkLgoqODoJd3JpdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgTUlDIGFuZCBwb3NzaWJsZSBzb21lIGdhcmJhZ2UgdG8gTklDIFJBTQoqCU5vdGU6IGkgaXMgYWx3YXlzIDQgKGEgbG9vcC1pbnZhcmlhbnQgb2YgdGhlIHdoaWxlIGluIHBvaW50IDIpCioKKi5OT1RJQ0UKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyB2b2lkCnB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQp7CiNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCglpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ICE9IDB4RkZGRikgewkJLy9pZiBNSUMgY2FsY3VsYXRpb24gYWN0aXZlCgkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOwkJCQkvLy4gIGZlZWQgKHVwIHRvIDggYnl0ZXMgb2YpIHZpcnR1YWwgcGFkZGluZyB0byBNSUMgZW5naW5lCgkJCQkJCQkJCQkJCS8vLiAgd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBieXRlICsgKG1vc3Qgb2YpIE1JQwoJCXB1dF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaWZicC0+SUZCX01JQ1R4LCA4IEJFX1BBUigwKSApOwoJfQojZW5kaWYgLy8gSENGX1RZUEVfV1BBCglwdXRfZnJhZyggaWZicCwgbnVsbF9hZGRyLCAxIEJFX1BBUigwKSApOwkvL3dyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgZGF0YSBvciBNSUMgYnl0ZQp9IC8vIHB1dF9mcmFnX2ZpbmFsaXplCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKi5QVVJQT1NFCQlzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJYWRkcmVzcyBpbiBOSUMgUkFNIHdoZXJlIExWVC1yZWNvcmRzIGFyZSBsb2NhdGVkCioKKi5SRVRVUk5TCioJSENGX1NVQ0NFU1MKKgk+PnB1dF9mcmFnCioJPj5jbWRfd2FpdAoqCiouREVTQ1JJUFRJT04KKgoqCiouRElBR1JBTQoqMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKKjI0OiBJZiB0aGUgUklEIGRvZXMgbm90IGV4aXN0LCB0aGUgTC1maWVsZCBpcyBzZXQgdG8gemVyby4KKglOb3RlIHRoYXQgc29tZSBSSURzIGNhbiBub3QgYmUgcmVhZCwgZS5nLiB0aGUgcHNldWRvIFJJRHMgZm9yIGRpcmVjdCBIZXJtZXMgY29tbWFuZHMgYW5kIENGR19ERUZBVUxUX0tFWVMKKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCioKKi5OT1RJQ0UKKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfUkVHX01CKSBhcmUgZXhwbGljaXRseSBoYW5kbGVkIGJ5IHRoZSBIQ0Ygd2hpY2ggaW1wbGllcyB0aGF0IHRoZXNlIGNvZGVzCioJCWFyZSB2YWxpZC4gVGhlc2UgY29kZXMgYXJlIGFscmVhZHkgY29uc3VtZWQgYnkgaGNmX3B1dF9pbmZvLgoqCSAgLSBhbGwgb3RoZXIgY29kZXMgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiBCZWZvcmUgdGhlIHB1dCBhY3Rpb24gaXMgZXhlY3V0ZWQsIGhjZl9nZXRfaW5mbyBpcyBjYWxsZWQKKgkJd2l0aCBhbiBMVFYgcmVjb3JkIHdpdGggYSB2YWx1ZSBvZiAxIGluCXRoZSBMLWZpZWxkIGFuZCB0aGUgaW50ZW5kZWQgcHV0IGFjdGlvbiB0eXBlIGluIHRoZSBUeXAtY29kZQoqCQlmaWVsZC4gSWYgdGhlIHB1dCBhY3Rpb24gdHlwZSBpcyB2YWxpZCwgaXQgaXMgYWxzbyB2YWxpZCBhcyBhIGdldCBhY3Rpb24gdHlwZSBjb2RlIC0gZXhjZXB0CioJCWZvciBDRkdfREVGQVVMVF9LRVlTIGFuZCBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgLSBzbyB0aGUgSENGX0FTU0VSVCBsb2dpYyBvZiBoY2ZfZ2V0X2luZm8gc2hvdWxkCioJCW5vdCBjYXRjaC4KKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwCSkKewoKaW50IHJjID0gSENGX1NVQ0NFU1M7CgoJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCwgTUVSR0VfMiggbHR2cC0+dHlwLCBpZmJwLT5JRkJfQ2FyZFN0YXQgKSApCglIQ0ZBU1NFUlQoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCwgbHR2cC0+dHlwICkKCglpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmCQkJCQkJCQkJCQkJCQkJCS8qIDIwKi8KCQkgKCAoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgICAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCApIHx8CgkJICAgKCBDRkdfUklEX0VOR19NSU4gPD0gbHR2cC0+dHlwIC8qICYmIGx0dnAtPnR5cCA8PSAweEZGRkYgKi8gICAgICAgKSAgICAgKSApIHsKI2lmIEhDRl9BU1NFUlQgLy9GQ0M4LCBGQ0IwLCBGQ0I0LCBGQ0I2LCBGQ0I3LCBGQ0I4LCBGQ0MwLCBGQ0M0LCBGQ0JDLCBGQ0JELCBGQ0JFLCBGQ0JGCiB7CiBoY2ZfMTYJCXQgPSBsdHZwLT50eXA7CiBMVFZfU1RSQ1QgCXggPSB7IDIsIHQsIHswfSB9OwkJCQkJCQkJCQkJCQkJCS8qMjQqLwoJaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmeCApOwoJaWYgKCB4LmxlbiA9PSAwICYmCgkJICggdCAhPSBDRkdfREVGQVVMVF9LRVlTICYmIHQgIT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZICYmCgkJICAgdCAhPSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZICYmCgkJICAgdCAhPSBDRkdfSEFORE9WRVJfQUREUiAmJiB0ICE9IENGR19ESVNBU1NPQ0lBVEVfQUREUiAmJgoJCSAgIHQgIT0gQ0ZHX0ZDQkMgJiYgdCAhPSBDRkdfRkNCRCAmJiB0ICE9IENGR19GQ0JFICYmIHQgIT0gQ0ZHX0ZDQkYgJiYKCQkgICB0ICE9IENGR19ERUFVVEhFTlRJQ0FURV9BRERSCgkJICkKCQkpIHsKCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+dHlwICkKCQl9CiB9CiNlbmRpZiAvLyBIQ0ZfQVNTRVJUCgoJCXJjID0gc2V0dXBfYmFwKCBpZmJwLCBsdHZwLT50eXAsIDAsIElPX09VVCApOwoJCXB1dF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApbHR2cCwgMipsdHZwLT5sZW4gKyAyIEJFX1BBUigyKSApOwovKjI4Ki8JaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUyArIEhDTURfQUNDRVNTX1dSSVRFLCBsdHZwLT50eXAgKTsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0gLy8gcHV0X2luZm8KCgojaWYgKEhDRl9ETF9PTkxZKSA9PSAwCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqLlNVQk1PRFVMRQkJaW50IHB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQoqLlBVUlBPU0UJIAlhY2N1bXVsYXRlcyBhICggc2VyaWVzIG9mKSBidWZmZXJzIGludG8gYSBzaW5nbGUgSW5mbyBibG9jayBpbnRvIHRoZSBNYWlsQm94LgoqCiouQVJHVU1FTlRTCioJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCioJbHR2cAkJYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgInR5cGUiIGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBzeW50aGVzaXplZAoqCQkJCWFzIGFuIExUViBpbnRvIHRoZSBNYWlsQm94CioKKi5SRVRVUk5TCioKKi5ERVNDUklQVElPTgoqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgoqIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZC4KKiBIQ0ZfQVNTRVJUIGRvZXMgbm90IGNhdGNoLgoqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgoqCiogTm90ZSB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCAxIHdvcmQgb2YgdW51c2VkIHNwYWNlIGluIHRoZSBtYWlsIGJveC4KKiBBcyBhIGNvbnNlcXVlbmNlOgoqIC0gbm8gcHJvYmxlbSBpbiBwb2ludGVyIGFyaXRobWV0aWMgKE1CX1JQID09IE1CX1dQIG1lYW5zIHVuYW1iaWd1b3VzbHkgbWFpbCBib3ggaXMgY29tcGxldGVseSBlbXB0eQoqIC0gVGhlcmUgaXMgYWx3YXlzIGZyZWUgc3BhY2UgdG8gd3JpdGUgYW4gTCBmaWVsZCB3aXRoIGEgdmFsdWUgb2YgemVybyBhZnRlciBlYWNoIE1CX0luZm8gYmxvY2suICBUaGlzCiogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCioKKgoqLkRJQUdSQU0KKjE6CUNhbGN1bGF0ZSBMIGZpZWxkIG9mIHRoZSBNQklCLCBpLmUuIDEgZm9yIHRoZSBULWZpZWxkICsgdGhlIGN1bXVsYXRpdmUgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudHMuCioyOglUaGUgZnJlZSBzcGFjZSBpbiB0aGUgTWFpbEJveCBpcyBjYWxjdWxhdGVkICgyYTogZnJlZSBwYXJ0IGZyb20gV3JpdGUgUHRyIHRvIFJlYWQgUHRyLCAyYjogZnJlZSBwYXJ0CioJdHVybnMgb3V0IHRvIHdyYXAgYXJvdW5kKSAuIElmIHRoaXMgc3BhY2Ugc3VmZmljZXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3b3JkcyByZWZsZWN0ZWQgYnkgbGVuIChULWZpZWxkCioJKyBWYWx1ZS1maWVsZCkgcGx1cyB0aGUgYWRkaXRpb25hbCBNYWlsQm94IEluZm8gTC1maWVsZCArIGEgdHJhaWxpbmcgMCB0byBhY3QgYXMgdGhlIEwtZmllbGQgb2YgYSB0cmFpbGluZwoqCWR1bW15IG9yIGVtcHR5IExUViByZWNvcmQsIHRoZW4gYSBNYWlsQm94IEluZm8gYmxvY2sgaXMgYnVpbGQgaW4gdGhlIE1haWxCb3ggY29uc2lzdGluZyBvZgoqCSAgLSB0aGUgdmFsdWUgbGVuIGluIHRoZSBmaXJzdCB3b3JkCioJICAtIHR5cGUgaW4gdGhlIHNlY29uZCB3b3JkCioJICAtIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGZyYWdtZW50cyBpbiB0aGUgc2Vjb25kIGFuZCBoaWdoZXIgd29yZAoqCio0OglTaW5jZSBwdXRfaW5mb19tYigpIGNhbiBtb3JlIG9yIGxlc3MgZGlyZWN0bHkgYmUgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCwgdGhlIEkvRiBtdXN0IGJlIHJvYnVzdAoqCWFnYWluc3Qgb3V0LW9mLXJhbmdlIHZhcmlhYmxlcy4gQXMgZmFpbHNhZmUgY29kaW5nLCB0aGUgTUIgdXBkYXRlIGlzIHNraXBwZWQgYnkgY2hhbmdpbmcgdGxlbiB0byAwIGlmCioJbGVuID09IDA7IFRoaXMgd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGFuIGFzc2VydCBhcyByZXN1bHQgb2YgdGhlIHZpb2xhdGlvbiBvZiB0aGUgbmV4dCBpZiBjbGF1c2UuCio2OglDaGVjayB3aGV0aGVyIHRoZSBmcmVlIHNwYWNlIGluIE1haWxCb3ggc3VmZmljZXMgKHRoaXMgY292ZXJzIHRoZSBjb21wbGV0ZSBhYnNlbmNlIG9mIHRoZSBNYWlsQm94KS4KKglOb3RlIHRoYXQgbGVuIGlzIHVuc2lnbmVkLCBzbyBldmVuIE1TRiBJL0YgdmlvbGF0aW9uIHdvcmtzIG91dCBPLksuCioJVGhlICcyJyBpbiB0aGUgZXhwcmVzc2lvbiAibGVuKzIiIGlzIHVzZWQgYmVjYXVzZSAxIHdvcmQgaXMgbmVlZGVkIGZvciBMIGl0c2VsZiBhbmQgMSB3b3JkIGlzIG5lZWRlZAoqCWZvciB0aGUgemVyby1zZW50aW5lbAoqODoJdXBkYXRlIE1haWxCb3ggSW5mbyBsZW5ndGggcmVwb3J0IHRvIE1TRiB3aXRoICJvbGRlc3QiIE1CIEluZm8gQmxvY2sgc2l6ZS4gQmUgY2FyZWZ1bGwgaGVyZSwgaWYgeW91IGdldAoqCWhlcmUgYmVmb3JlIHRoZSBNYWlsQm94IGlzIHJlZ2lzdGVyZWQsIHlvdSBjYW4ndCByZWFkIGZyb20gdGhlIGJ1ZmZlciBhZGRyZXNzZWQgYnkgSUZCX01CcCAoaXQgaXMgdGhlCioJTnVsbCBidWZmZXIpIHNvIGRvbid0IG1vdmUgdGhpcyBjb2RlIHRpbGwgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgYnV0IGtlZXAgaXQgd2hlcmUgdGhlcmUgaXMgZ2FydWFudGVlZAoqCWEgYnVmZmVyLgoqCiouTk9USUNFCioJYm91bmRhcnkgdGVzdGluZyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgSUZCX01CU2l6ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gaWYgbm8gTWFpbEJveCBpcyBwcmVzZW50LAoqCWFuZCB0byBhIGxlc3NlciBkZWdyZWUsIHRoYXQgSUZCX01CV3AgPSBJRkJfTUJScCA9IDAKKgoqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKCkhDRl9TVEFUSUMgaW50CnB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQp7CgppbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwpoY2ZfMTYJCWk7CQkJCQkJLy93b3JrIGNvdW50ZXIKaGNmXzE2CQkqZHA7CQkJCQkvL2Rlc3RpbmF0aW9uIHBvaW50ZXIgKGluIE1haWxCb3gpCndjaV9yZWNvcmRwCXNwOwkJCQkJCS8vc291cmNlIHBvaW50ZXIKaGNmXzE2CQlsZW47CQkJCQkvL3RvdGFsIGxlbmd0aCB0byBjb3B5IHRvIE1haWxCb3gKaGNmXzE2CQl0bGVuOwkJCQkJLy9mcmVlIGxlbmd0aC93b3JraW5nIGxlbmd0aC9vZmZzZXQgaW4gV01QIGZyYW1lCgoJaWYgKCBpZmJwLT5JRkJfTUJwID09IE5VTEwgKSByZXR1cm4gcmM7ICAvLzs/bm90IHN1ZmZpY2llbnQKCUhDRkFTU0VSVCggaWZicC0+SUZCX01CcCAhPSBOVUxMLCAwICkJCQkJCS8vISEhYmUgY2FyZWZ1bCwgZG9uJ3QgZ2V0IGludG8gYW4gZW5kbGVzcyByZWN1cnNpb24KCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSwgMCApCgoJbGVuID0gMTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsKCQlsZW4gKz0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47Cgl9CglpZiAoIGlmYnAtPklGQl9NQlJwID4gaWZicC0+SUZCX01CV3AgKSB7CgkJdGxlbiA9IGlmYnAtPklGQl9NQlJwIC0gaWZicC0+SUZCX01CV3A7CQkJCQkJCQkJCQkJCQkJLyogMmEqLwoJfSBlbHNlIHsKCQlpZiAoIGlmYnAtPklGQl9NQlJwID09IGlmYnAtPklGQl9NQldwICkgewoJCQlpZmJwLT5JRkJfTUJScCA9IGlmYnAtPklGQl9NQldwID0gMDsJLy8gb3B0aW1pemUgV3JhcHBpbmcKCQl9CgkJdGxlbiA9IGlmYnAtPklGQl9NQlNpemUgLSBpZmJwLT5JRkJfTUJXcDsJCQkJCQkJCQkJCQkJCS8qIDJiKi8KCQlpZiAoICggdGxlbiA8PSBsZW4gKyAyICkgJiYgKCBsZW4gKyAyIDwgaWZicC0+SUZCX01CUnAgKSApIHsJLy9pZiB0cmFpbGluZyBzcGFjZSBpcyB0b28gc21hbGwgYnV0CgkJCQkJCQkJCQkJCQkJCQkJLy8JIGxlYWRpbmcgc3BhY2UgaXMgc3VmZmljaWVudGx5IGxhcmdlCgkJCWlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CV3BdID0gMHhGRkZGOwkJCQkJLy9mbGFnIGR1bW15IExUViB0byBmaWxsIHRoZSB0cmFpbGluZyBzcGFjZQoJCQlpZmJwLT5JRkJfTUJXcCA9IDA7CQkJCQkJCQkJCS8vcmVzZXQgV3JpdGVQb2ludGVyIHRvIGJlZ2luIG9mIE1haWxCb3gKCQkJdGxlbiA9IGlmYnAtPklGQl9NQlJwOwkJCQkJCQkJCS8vZ2V0IG5ldyBhdmFpbGFibGUgc3BhY2Ugc2l6ZQoJCX0KCX0KCWRwID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CV3BdOwoJaWYgKCBsZW4gPT0gMCApIHsKCQl0bGVuID0gMDsgLy87PyB3aGF0IGlzIHRoaXMgZ29vZCBmb3IKCX0KCWlmICggbGVuICsgMiA+PSB0bGVuICl7CQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA2ICovCgkJLy9EbyBOb3QgQVNTRVJULCB0aGlzIGlzIGEgbm9ybWFsIGNvbmRpdGlvbgoJCUlGX1RBTExZKCBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZNQisrOyApIC8qTk9QIHRvIGNvdmVyIGFnYWluc3QgYW5hbG9taWVzIHdpdGggZW1wdHkgY29tcG91bmQqLzsKCQlyYyA9IEhDRl9FUlJfTEVOOwoJfSBlbHNlIHsKCQkqZHArKyA9IGxlbjsJCQkJCQkJCQkvL3dyaXRlIExlbiAoPSBzaXplIG9mIFQrViBpbiB3b3JkcyB0byBNQl9JbmZvIGJsb2NrCgkJKmRwKysgPSBsdHZwLT5iYXNlX3R5cDsJCQkJCQkJLy93cml0ZSBUeXBlIHRvIE1CX0luZm8gYmxvY2sKCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOwkJCQkJCS8vdXBkYXRlIFdyaXRlUG9pbnRlciBvZiBNYWlsQm94CgkJZm9yICggaSA9IDA7IGkgPCBsdHZwLT5mcmFnX2NudDsgaSsrICkgewkJCQkvLyBwcm9jZXNzIGVhY2ggb2YgdGhlIGZyYWdtZW50cwoJCQlzcCA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfYWRkcjsKCQkJbGVuID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47CgkJCXdoaWxlICggbGVuLS0gKSAqZHArKyA9ICpzcCsrOwoJCX0KCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDA7CQkJCS8vdG8gYXNzdXJlIGdldF9pbmZvIGZvciBDRkdfTUJfSU5GTyBzdG9wcwoJCWlmYnAtPklGQl9NQkluZm9MZW4gPSBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXTsJCQkJCQkJCQkJCS8qIDggKi8KCX0KCXJldHVybiByYzsKfSAvLyBwdXRfaW5mb19tYgoKI2VuZGlmIC8vIEhDRl9FWFRfTUIKI2VuZGlmIC8vIEhDRl9ETF9PTkxZCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiouU1VCTU9EVUxFCQlpbnQgc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKKi5QVVJQT1NFCQlzZXQgdXAgZGF0YSBhY2Nlc3MgdG8gTklDIFJBTSB2aWEgQkFQXzEuCioKKi5BUkdVTUVOVFMKKglpZmJwCQkJYWRkcmVzcyBvZiBJL0YgQmxvY2sKKglmaWQJCQkJRklEL1JJRAoqCW9mZnNldAkJCSEhZXZlbiEhIG9mZnNldCBpbiBGSUQvUklECioJdHlwZQkJCUlPX0lOLCBJT19PVVQKKgoqLlJFVFVSTlMKKglIQ0ZfU1VDQ0VTUwkJCQkJTy5LCioJSENGX0VSUl9OT19OSUMJCQkJY2FyZCBpcyByZW1vdmVkCioJSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUCUZhdGFsIG1hbGZ1bmN0aW9uIGRldGVjdGVkCioJSENGX0VSUl9ERUZVTkNUXy4uLi4uCQlpZiBhbmQgb25seSBpZiBJRkJfRGVmdW5jdFN0YXQgPD4gMAoqCiouREVTQ1JJUFRJT04KKgoqIEEgbm9uLXplcm8gcmV0dXJuIHN0YXR1cyBpbmRpY2F0ZXM6CiogLSB0aGUgTklDIGlzIGNvbnNpZGVyZWQgbm9ub3BlcmF0aW9uYWwsIGUuZy4gZHVlIHRvIGEgdGltZS1vdXQgb2Ygc29tZSBIZXJtZXMgYWN0aXZpdHkgaW4gdGhlIHBhc3QKKiAtIEJBUF8xIGNvdWxkIG5vdCBwcm9wZXJseSBiZSBpbml0aWFsaXplZAoqIC0gdGhlIGNhcmQgaXMgcmVtb3ZlZCBiZWZvcmUgY29tcGxldGlvbiBvZiB0aGUgZGF0YSB0cmFuc2ZlcgoqIEluIGFsbCBvdGhlciBjYXNlcywgYSB6ZXJvIGlzIHJldHVybmVkLgoqIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGluZGljYXRlcyBhbiBIL1cgZXJyb3Igd2hpY2ggaXMgdmVyeSBsaWtlbHkgdG8gc2lnbmFsIGNvbXBsZXRlIEgvVyBmYWlsdXJlLgoqIE9uY2UgYSBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBoYXMgb2NjdXJyZWQgYWxsIHN1YnNlcXVlbnQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIEhlcm1lcyB3aWxsIHJldHVybiBhCiogImRlZnVuY3QiIHN0YXR1cyB0aWxsIHRoZSBIZXJtZXMgaXMgcmUtaW5pdGlhbGl6ZWQgYnkgbWVhbnMgb2YgYW4gaGNmX2Nvbm5lY3QuCioKKiBBIEJBUCBpcyBhIHNldCBvZiByZWdpc3RlcnMgKE9mZnNldCwgU2VsZWN0IGFuZCBEYXRhKSBvZmZlcmluZyByZWFkL3dyaXRlIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgRklEIG9yCiogUklELiBUaGlzIGFjY2VzcyBpcyBiYXNlZCBvbiBhIGF1dG8taW5jcmVtZW50IGZlYXR1cmUuCiogVGhlcmUgYXJlIHR3byBCQVBzIGJ1dCB0aGVzZSBkYXlzIHRoZSBIQ0YgdXNlcyBvbmx5IEJBUF8xIGFuZCBsZWF2ZXMgQkFQXzAgdG8gdGhlIFBDSSBCdXNtYXN0ZXJpbmcgSC9XLgoqCiogVGhlIEJBUC1tZWNoYW5pc20gaXMgYmFzZWQgb24gdGhlIEJ1c3kgYml0IGluIHRoZSBPZmZzZXQgcmVnaXN0ZXIgKHNlZSB0aGUgSGVybWVzIGRlZmluaXRpb24pLiBUaGUgd2FpdGluZwoqIGZvciBCdXN5IG11c3Qgb2NjdXIgYmV0d2VlbiB3cml0aW5nIHRoZSBPZmZzZXQgcmVnaXN0ZXIgYW5kIGFjY2Vzc2luZyB0aGUgRGF0YSByZWdpc3Rlci4gVGhlCiogaW1wbGVtZW50YXRpb24gdG8gd2FpdCBmb3IgdGhlIEJ1c3kgYml0IGRyb3AgYWZ0ZXIgZWFjaCB3cml0ZSB0byB0aGUgT2Zmc2V0IHJlZ2lzdGVyLCBpbXBsaWVzIHRoYXQgdGhlCiogcmVxdWlyZW1lbnQgdGhhdCB0aGUgQnVzeSBiaXQgaXMgbG93ICBiZWZvcmUgdGhlIFNlbGVjdCByZWdpc3RlciBpcyB3cml0dGVuLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KKiBCQVAtc2V0dXAgbWF5IGJlIHRpbWUgY29uc3VtaW5nIChlLmcuIDM4MCB1c2VjIGZvciBsYXJnZSBvZmZzZXRzIG9jY3VycyBmcmVxdWVudGx5KS4gVGhlIHdhaXQgZm9yIEJ1c3kgYml0CiogZHJvcCBpcyBwcm90ZWN0ZWQgYnkgYSBsb29wIGNvdW50ZXIsIHdoaWNoIGlzIGluaXRpYWxpemVkIHdpdGggSUZCX1RpY2tJbmksIHdoaWNoIGlzIGNhbGlicmF0ZWQgaW4gaW5pdC4KKgoqIFRoZSBOSUMgSS9GIGlzIG9wdGltaXplZCBmb3Igd29yZCB0cmFuc2ZlciBhbmQgY2FuIG9ubHkgaGFuZGxlIHdvcmQgdHJhbnNmZXIgYXQgYSB3b3JkIGJvdW5kYXJ5IGluIE5JQwoqIFJBTS4gVGhlIGludGVuZGVkIHNvbHV0aW9uIGZvciB0cmFuc2ZlciBvZiBhIHNpbmdsZSBieXRlIGhhcyBtdWx0aXBsZSBIL1cgZmxhd3MuIFRoZXJlIGhhdmUgYmVlbiBkaWZmZXJlbnQKKiBTL1cgV29ya2Fyb3VuZCBzdHJhdGVnaWVzLiBSSUQgYWNjZXNzIGlzIGhjZl8xNiBiYXNlZCBieSAibmF0dXJlIiwgc28gbm8gYnl0ZSBhY2Nlc3MgcHJvYmxlbXMuICBGb3IgVHgvUngKKiBGSUQgYWNjZXNzLCAgdGhlIGJ5dGUgbG9naWMgYmVjYW1lIG9ic29sZXRlIGJ5IGFic29yYmluZyBpdCBpbiB0aGUgZG91YmxlIHdvcmQgb3JpZW50ZWQgbmF0dXJlIG9mIHRoZSBNSUMKKiBmZWF0dXJlLgoqCioKKi5ESUFHUkFNCioKKjI6CXRoZSB0ZXN0IG9uIHJjIGNoZWNrcyB3aGV0aGVyIHRoZSBIQ0Ygd2VudCBpbnRvICJkZWZ1bmN0IiBtb2RlICggZS5nLiBCQVAgaW5pdGlhbGl6YXRpb24gb3IgYSBjYWxsIHRvCioJY21kX3dhaXQgZGlkIGV2ZXIgZmFpbCkuCio0Ogl0aGUgc2VsZWN0IHJlZ2lzdGVyIGFuZCBvZmZzZXQgcmVnaXN0ZXIgYXJlIHNldAoqCXRoZSBvZmZzZXQgcmVnaXN0ZXIgaXMgbW9uaXRvcmVkIHRpbGwgYSBzdWNjZXNzZnVsIGNvbmRpdGlvbiAobm8gYnVzeSBiaXQpIGlzIGRldGVjdGVkIG9yIHRpbGwgdGhlCioJKGNhbGlicmF0ZWQpIHByb3RlY3Rpb24gY291bnRlciBleHBpcmVzCioJSWYgdGhlIGNvdW50ZXIgZXhwaXJlcywgdGhpcyBpcyByZWZsZWN0ZWQgaW4gSUZCX0RlZnVuY3RTdGF0LCBzbyBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBzZXR1cF9iYXAgZmFpbAoqCWltbWVkaWF0ZWx5ICggc2VlIDIpCio2Oglpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FycnkgYXMgdXNlZCBieSBwZXQvZ2V0X2ZyYWcKKjg6CUhSRUdfT0ZGU0VUX0VSUiBpcyBpZ25vcmVkIGFzIGVycm9yIGJlY2F1c2U6CioJIGE6IHRoZSBIZXJtZXMgaXMgcm9idXN0IGFnYWluc3QgaXQKKgkgYjogaXQgaXMgbm90IGtub3duIHdoYXQgY2F1c2VzIGl0IChwcm9iYWJseSBhIGJ1ZyksIGhlbmNlIG5vIHN0cmF0ZWd5IGNhbiBiZSBzcGVjaWZpZWQgd2hpY2ggbGV2ZWwgaXMKKgkJdG8gaGFuZGxlIHRoaXMgZXJyb3IgaW4gd2hpY2ggd2F5LiBJbiB0aGUgcGFzdCwgaXQgY291bGQgYmUgaW5kdWNlZCBieSB0aGUgTVNGIGxldmVsLCBlLmcuIGJ5IGNhbGxpbmcKKgkJaGNmX3Jjdl9tc2cgd2hpbGUgdGhlcmUgd2FzIG5vIFJ4LUZJRCBhdmFpbGFibGUuIFNpbmNlIHRoaXMgaXMgYW4gTVNGLWVycm9yIHdoaWNoIGlzIGNhdWdodCBieSBBU1NFUlQsCioJCXRoZXJlIGlzIG5vIHJ1bi10aW1lIGFjdGlvbiByZXF1aXJlZCBieSB0aGUgSENGLgoqCUx1bXBpbmcgdGhlIE9mZnNldCBlcnJvciBpbiB3aXRoIHRoZSBCdXN5IGJpdCBlcnJvciwgYXMgaGFzIGJlZW4gZG9uZSBpbiB0aGUgcGFzdCB0dXJucyBvdXQgdG8gYmUgYQoqCWRpc2FzdGVyIG9yIGEgbGlmZSBzYXZlciwganVzdCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzLiBTaW5jZSBubyBwcmVkaWN0aW9uIGNhbiBiZQoqCWRvbmUgYWJvdXQgdGhlIGZ1dHVyZSwgaXQgaXMgImZlbHQiIHRvIGJlIHRoZSBiZXN0IHN0cmF0ZWd5IHRvIGlnbm9yZSB0aGlzIGVycm9yLiBPbmUgZGF5IHRoZSBjb2RlIHdhcwoqCWFjY29tcGFuaWVkIGJ5IHRoZSBmb2xsb3dpbmcgY29tbWVudDoKKgkvLwlpZ25vcmUgSFJFR19PRkZTRVRfRVJSLCBzb21lb25lLCBzdXBwb3NlZGx5IHRoZSBNU0YgcHJvZ3JhbW1lciA7KSBtYWRlIGEgYnVnLiBTaW5jZSB3ZSBkb24ndCBrbm93CioJLy8Jd2hhdCBpcyBnb2luZyBvbiwgd2UgbWlnaHQgYXMgd2VsbCBnbyBvbiAtIHVuZGVyIG1hbmFnZW1lbnQgcHJlc3N1cmUgLSBieSBpZ25vcmluZyBpdAoqCiouRU5ERE9DICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSENGX1NUQVRJQyBpbnQKc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKewpQUk9UX0NOVF9JTkkKaW50CXJjOwoKCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfU1RSSU8gKTsKCWlmICggKCByYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCApID09IEhDRl9TVUNDRVNTICkgewkJCQkJCQkJCQkvKjIqLwoJCU9QVyggSFJFR19TRUxFQ1RfMSwgZmlkICk7CQkJCQkJCQkJCQkJCQkJCS8qNCovCgkJT1BXKCBIUkVHX09GRlNFVF8xLCBvZmZzZXQgKTsKCQlpZiAoIHR5cGUgPT0gSU9fSU4gKSB7CgkJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKCQl9CgkJZWxzZSBpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOwoJCUhDRl9XQUlUX1dISUxFKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSENNRF9CVVNZICk7CgkJSENGQVNTRVJUKCAhKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSFJFR19PRkZTRVRfRVJSICksIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQkJCS8qOCovCgkJaWYgKCBwcm90X2NudCA9PSAwICkgewoJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggZmlkLCBvZmZzZXQgKSApCgkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOwoJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CgkJfQoJfQoJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyB8IEhDRl9UUkFDRV9FWElUICk7CglyZXR1cm4gcmM7Cn0gLy8gc2V0dXBfYmFwCgo=