Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6IEFuZHJlYXMgRWhyZXQsIFRvYmlhcyBDaGFsdXBrYQogICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdG9wIGxldmVsIHByb2Nlc3NpbmcuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKCiNpbmNsdWRlICJzYnJfcmFtLmgiCiNpbmNsdWRlICJzYnJfcm9tLmgiCiNpbmNsdWRlICJzYnJlbmNfZnJlcV9zY2EuaCIKI2luY2x1ZGUgImVudl9iaXQuaCIKI2luY2x1ZGUgImNtb25kYXRhLmgiCiNpbmNsdWRlICJzYnJfbWlzYy5oIgojaW5jbHVkZSAic2JyLmgiCiNpbmNsdWRlICJxbWYuaCIKCiNpbmNsdWRlICJwc19tYWluLmgiCgojZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMCAzCiNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwxIDMKI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDIgOAoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBTQlIgRGVsYXkgYmFsYW5jaW5nIGRlZmluaXRpb25zLgogKi8KCi8qCiAgICAgIGlucHV0IGJ1ZmZlciAoMWNoKQoKICAgICAgfC0tLS0tLS0tLS0tLSAxNTM3ICAgLS0tLS0tLS0tLS0tLXwtLS0tLXwtLS0tLS0tLS0tIDIwNDggLS0tLS0tLS0tLS0tLXwKICAgICAgICAgICAoY29yZTJzYnIgZGVsYXkgICAgICkgICAgICAgICAgZHMgICAgIChyZWFkLCBjb3JlIGFuZCBkcyBhcmVhKQoqLwoKI2RlZmluZSBTRkIoZHduc21wKSAgICAgICAgKDMyIDw8IChkd25zbXAtMSkpICAgICAvKiBTQlIgRnJlcXVlbmN5IGJhbmRzOiA2NCBmb3IgZHVhbC1yYXRlLCAzMiBmb3Igc2luZ2xlLXJhdGUgKi8KI2RlZmluZSBTVFMoZmwpICAgICAgICAgICAgKCgoZmwpPT0xMDI0KT8zMjozMCkgICAvKiBTQlIgVGltZSBTbG90czogMzIgZm9yIGNvcmUgZnJhbWUgbGVuZ3RoIDEwMjQsIDMwIGZvciBjb3JlIGZyYW1lIGxlbmd0aCA5NjAgKi8KCiNkZWZpbmUgREVMQVlfUU1GX0FOQShkd25zbXApICgoMzIwPDwoKGR3bnNtcCktMSkpIC0gKDMyPDwoKGR3bnNtcCktMSkpKSAvKiBGdWxsIGJhbmR3aWR0aCAqLwojZGVmaW5lIERFTEFZX0hZQl9BTkEgICAgICAgICAoMTAqNjQpICAgICAgIC8qICsgMC41ICovICAgICAgICAgICAgICAvKiAgKi8KI2RlZmluZSBERUxBWV9IWUJfU1lOICAgICAgICAgKDYqNjQgLSAzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICovCiNkZWZpbmUgREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkgKDMyKihkd25zbXApKSAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBwb3N0cHJvY2Vzc2luZyBkZWxheSAqLwojZGVmaW5lIERFTEFZX0RFQ19RTUYoZHduc21wKSAoNiAqIFNGQihkd25zbXApICkgICAgICAgICAgICAgICAgICAgICAvKiBEZWNvZGVyIFFNRiBvdmVybGFwICovCiNkZWZpbmUgREVMQVlfUU1GX1NZTiAgICAgICAgICgyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PX1BPTFkvMj0yLjUsIHJvdW5kZWQgZG93biB0byAyICovCiNkZWZpbmUgREVMQVlfUU1GX0RTICAgICAgICAgICgzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNRiBzeW50aGVzaXMgZm9yIGRvd25zYW1wbGVkIHRpbWUgc2lnbmFsICovCgovKiBEZWxheSBpbiBRTUYgcGF0aHMgKi8KI2RlZmluZSBERUxBWV9TQlIoZmwsZHduc21wKSAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIChTRkIoZHduc21wKSpTVFMoZmwpIC0gMSkgKyBERUxBWV9RTUZfU1lOKQojZGVmaW5lIERFTEFZX1BTKGZsLGR3bnNtcCkgICAgICAoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfSFlCX0FOQSArIERFTEFZX0RFQ19RTUYoZHduc21wKSArIChTRkIoZHduc21wKSpTVFMoZmwpLTEpICsgREVMQVlfSFlCX1NZTiArIERFTEFZX1FNRl9TWU4pCiNkZWZpbmUgREVMQVlfRUxEU0JSKGZsLGR3bnNtcCkgICggKCAoKGZsKS8yKSooZHduc21wKSApIC0gMSArIERFTEFZX1FNRl9QT1NUUFJPQyhkd25zbXApICkKCi8qIERlbGF5IGRpZmZlcmVuY2VzIGZvciBTQlIgYW5kIFNCUitQUyAqLwojZGVmaW5lIE1BWF9EU19GSUxURVJfREVMQVkgKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBhZGRpdGlvbmFsIG1heCBkb3duc2FtcGxlciBmaWx0ZXIgZGVsYXkgKHNvdXJjZSBmcykgKi8KI2RlZmluZSBERUxBWV9BQUMyU0JSKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBERUxBWV9RTUZfU1lOKSAtIERFTEFZX1NCUigoZmwpLChkd25zbXApKSkKI2RlZmluZSBERUxBWV9FTEQyU0JSKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSkgLSBERUxBWV9FTERTQlIoZmwsZHduc21wKSkKI2RlZmluZSBERUxBWV9BQUMyUFMoZmwsZHduc21wKSAoKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX1FNRl9EUyArIC8qKERFTEFZX0FBQyhmbCkqMikgKyAqLyBERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyBERUxBWV9IWUJfU1lOICsgREVMQVlfUU1GX1NZTikgLSBERUxBWV9QUyhmbCxkd25zbXApKSAvKiAyMDQ4IC0gNDYzKjIgKi8KCi8qIEFzc3VtcHRpb246IFRoZSBzYW1wbGUgZGVsYXkgcmVzdWx0aW5nIG9mIG9mIERFTEFZX0FBQzJQUyBpcyBhbHdheXMgc21hbGxlciB0aGFuIHRoZSBzYW1wbGUgZGVsYXkgaW1wbGllZCBieSBERUxBWV9BQUMyU0JSICovCiNkZWZpbmUgTUFYX1NBTVBMRV9ERUxBWSAgICAgICAoREVMQVlfQUFDMlNCUigxMDI0LDIpICsgTUFYX0RTX0ZJTFRFUl9ERUxBWSkgLyogbWF4aW11bSBkZWxheTogZnJhbWUgbGVuZ3RoIG9mIDEwMjQgYW5kIGR1YWwtcmF0ZSBzYnIgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCiNkZWZpbmUgSU5WQUxJRF9UQUJMRV9JRFggLTEKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFNlbGVjdHMgdGhlIFNCUiB0dW5pbmcgc2V0dGluZ3MgdG8gdXNlIGRlcGVuZGVudCBvbiBudW1iZXIgb2YKICAgICAgICAgIGNoYW5uZWxzLCBiaXRyYXRlLCBzYW1wbGUgcmF0ZSBhbmQgY29yZSBjb2RlcgoKICBccmV0dXJuIEluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBESVNUQU5DRV9DRUlMX1ZBTFVFIDUwMDAwMDAKc3RhdGljIElOVApnZXRTYnJUdW5pbmdUYWJsZUluZGV4KFVJTlQgYml0cmF0ZSwgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCiAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGUsICAvKiEgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlLAogICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdAogICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBpLCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMSwgZm91bmQgPSAwOwogIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKCiAgI2RlZmluZSBpc0ZvclRoaXNDb3JlKGkpIFwKICAgICggKCBzYnJUdW5pbmdUYWJsZVtpXS5jb3JlQ29kZXIgPT0gQ09ERUNfQUFDTEQgJiYgY29yZSA9PSBBT1RfRVJfQUFDX0VMRCApIHx8IFwKICAgICAgKCBzYnJUdW5pbmdUYWJsZVtpXS5jb3JlQ29kZXIgPT0gQ09ERUNfQUFDICAgJiYgY29yZSAhPSBBT1RfRVJfQUFDX0VMRCApICkKCiAgZm9yIChpPTA7IGkgPCBzYnJUdW5pbmdUYWJsZVNpemUgOyBpKyspIHsKICAgIGlmICggaXNGb3JUaGlzQ29yZShpKSApIC8qIHR1bmluZyB0YWJsZSBpcyBmb3IgdGhpcyBjb3JlIGNvZGVjICovCiAgICB7CiAgICAgIGlmICggbnVtQ2hhbm5lbHMgPT0gc2JyVHVuaW5nVGFibGUgW2ldLm51bUNoYW5uZWxzCiAgICAgICAgJiYgc2FtcGxlUmF0ZSA9PSBzYnJUdW5pbmdUYWJsZSBbaV0uc2FtcGxlUmF0ZSApCiAgICAgIHsKICAgICAgICBmb3VuZCA9IDE7CiAgICAgICAgaWYgKChiaXRyYXRlID49IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSkgJiYKICAgICAgICAgICAgKGJpdHJhdGUgPCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewogICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBiaXRyYXRlOwogICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBiaXRyYXRlOwogICAgICAgICAgICAgIC8vRkRLcHJpbnRmKCJlbnRyeSAlZFxuIiwgaSk7CiAgICAgICAgICByZXR1cm4gaSA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICggc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSApIHsKICAgICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tOwogICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICggc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlICkgewogICAgICAgICAgICBpZiAoc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUby0xOwogICAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChwQml0UmF0ZUNsb3Nlc3QgIT0gTlVMTCkKICB7CiAgICAvKiBJZiB0aGVyZSB3YXMgYXQgbGVhc3Qgb25lIG1hdGNoaW5nIHR1bmluZyBlbnRyeSBmb3VuZCB0aGVuIHBpY2sgdGhlIGxlYXN0IGRpc3RhbmNlIGJpdCByYXRlICovCiAgICBpZiAoZm91bmQpCiAgICB7CiAgICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKICAgICAgaWYgKGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA+PSAwKSB7CiAgICAgICAgZGlzdGFuY2VMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXhdLmJpdHJhdGVGcm9tIC0gYml0cmF0ZTsKICAgICAgfQogICAgICBpZiAoYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID49IDApIHsKICAgICAgICBkaXN0YW5jZVVwcGVyID0gYml0cmF0ZSAtIHNiclR1bmluZ1RhYmxlIFtiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXhdLmJpdHJhdGVUbzsKICAgICAgfQogICAgICBpZiAoIGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyICkKICAgICAgewogICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOwogICAgICB9IGVsc2UgewogICAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdExvd2VyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gMDsKICAgIH0KICB9CgogIHJldHVybiBJTlZBTElEX1RBQkxFX0lEWDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgU2VsZWN0cyB0aGUgUFMgdHVuaW5nIHNldHRpbmdzIHRvIHVzZSBkZXBlbmRlbnQgb24gYml0cmF0ZQogIGFuZCBjb3JlIGNvZGVyCgogIFxyZXR1cm4gSW5kZXggdG8gdGhlIGFwcHJvcHJpYXRlIHRhYmxlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmdldFBzVHVuaW5nVGFibGVJbmRleChVSU5UIGJpdHJhdGUsIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdCl7CgogIElOVCBpLCBwYXJhbVNldHMgPSBzaXplb2YgKHBzVHVuaW5nVGFibGUpIC8gc2l6ZW9mIChwc1R1bmluZ1RhYmxlIFswXSk7CiAgaW50IGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleD0tMSwgYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4PS0xOwogIFVJTlQgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IDAsIGJpdFJhdGVDbG9zZXN0TG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKCiAgZm9yIChpID0gMCA7IGkgPCBwYXJhbVNldHMgOyBpKyspICB7CiAgICBpZiAoKGJpdHJhdGUgPj0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20pICYmCiAgICAgICAgKGJpdHJhdGUgPCBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8pKSB7CiAgICAgIHJldHVybiBpIDsKICAgIH0gZWxzZSB7CiAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPiBiaXRyYXRlICkgewogICAgICAgIGlmIChwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA8IGJpdFJhdGVDbG9zZXN0TG93ZXIpIHsKICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbTsKICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IGk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICggcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvIDw9IGJpdHJhdGUgKSB7CiAgICAgICAgaWYgKHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA+IGJpdFJhdGVDbG9zZXN0VXBwZXIpIHsKICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8tMTsKICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCiAgewogICAgaW50IGRpc3RhbmNlVXBwZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRSwgZGlzdGFuY2VMb3dlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFOwogICAgaWYgKGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA+PSAwKSB7CiAgICAgIGRpc3RhbmNlTG93ZXIgPSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4XS5iaXRyYXRlRnJvbSAtIGJpdHJhdGU7CiAgICB9CiAgICBpZiAoYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4ID49IDApIHsKICAgICAgZGlzdGFuY2VVcHBlciA9IGJpdHJhdGUgLSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CiAgICB9CiAgICBpZiAoIGRpc3RhbmNlVXBwZXIgPCBkaXN0YW5jZUxvd2VyICkKICAgIHsKICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0VXBwZXI7CiAgICB9IGVsc2UgewogICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RMb3dlcjsKICAgIH0KICB9CgogIHJldHVybiBJTlZBTElEX1RBQkxFX0lEWDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgSW4gY2FzZSBvZiBkb3duc2FtcGxlZCBTQlIgd2UgbWF5IG5lZWQgdG8gbG93ZXIgdGhlIHN0b3AgZnJlcQogICAgICAgICAgb2YgYSB0dW5pbmcgc2V0dGluZyB0byBmaXQgaW50byB0aGUgbG93ZXIgaGFsZiBvZiB0aGUKICAgICAgICAgIHNwZWN0cnVtICggd2hpY2ggaXMgc2FtcGxlUmF0ZS80ICkKCiAgXHJldHVybiB0aGUgYWRhcHRlZCBzdG9wIGZyZXF1ZW5jeSBpbmRleCAoLTEgLT4gZXJyb3IpCgogIFxpbmdyb3VwIFNickVuY0NmZwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVApGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSAoCiAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGVDb3JlLAogICAgICAgIGNvbnN0IElOVCBzdGFydEZyZXEsCiAgICAgICAgICAgICAgSU5UIHN0b3BGcmVxLAogICAgICAgIGNvbnN0IElOVCBkb3duU2FtcGxlRmFjdG9yCiAgICAgICAgKQp7CiAgSU5UIG1heFN0b3BGcmVxUmF3ID0gc2FtcGxlUmF0ZUNvcmUgLyAyOwogIElOVCBzdGFydEJhbmQsIHN0b3BCYW5kOwogIEhBTkRMRV9FUlJPUl9JTkZPIGVycjsKCiAgd2hpbGUgKHN0b3BGcmVxID4gMCAmJiBGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcoc3RvcEZyZXEsIHNhbXBsZVJhdGVDb3JlKSA+IG1heFN0b3BGcmVxUmF3KSB7CiAgICBzdG9wRnJlcS0tOwogIH0KCiAgaWYgKEZES3NickVuY19nZXRTYnJTdG9wRnJlcVJBVyggc3RvcEZyZXEsIHNhbXBsZVJhdGVDb3JlKSA+IG1heFN0b3BGcmVxUmF3KQogICAgcmV0dXJuIC0xOwoKICBlcnIgPSBGREtzYnJFbmNfRmluZFN0YXJ0QW5kU3RvcEJhbmQgKAogICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUNvcmU8PChkb3duU2FtcGxlRmFjdG9yLTEpLAogICAgICAgICAgICAgICAgc2FtcGxlUmF0ZUNvcmUsCiAgICAgICAgICAgICAgICAzMjw8KGRvd25TYW1wbGVGYWN0b3ItMSksCiAgICAgICAgICAgICAgICBzdGFydEZyZXEsCiAgICAgICAgICAgICAgICBzdG9wRnJlcSwKICAgICAgICAgICAgICAgJnN0YXJ0QmFuZCwKICAgICAgICAgICAgICAgJnN0b3BCYW5kCiAgICAgICAgICAgICAgICApOwogIGlmIChlcnIpCiAgICByZXR1cm4gLTE7CgogIHJldHVybiBzdG9wRnJlcTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIHRlbGxzIHVzLCBpZiBmb3IgdGhlIGdpdmVuIGNvcmVDb2RlciwgYml0cmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzCiAgICAgICAgICBhbmQgaW5wdXQgc2FtcGxpbmcgcmF0ZSBhbiBTQlIgc2V0dGluZyBpcyBhdmFpbGFibGUuIElmIHllcywgaXQKICAgICAgICAgIHRlbGxzIHVzIGFsc28gdGhlIGNvcmUgc2FtcGxpbmcgcmF0ZSB3ZSB3b3VsZCBuZWVkIHRvIHJ1biB3aXRoCgogIFxyZXR1cm4gYSBmbGFnIGluZGljYXRpbmcgc3VjY2VzczogeWVzICgxKSBvciBubyAoMCkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVSU5UCkZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCAoCiAgICAgICAgVUlOVCBiaXRyYXRlLCAgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCiAgICAgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgLyohIHRoZSB2YnIgcGFyYW10ZXIsIDAgbWVhbnMgY29uc3RhbnQgYml0cmF0ZSAqLwogICAgICAgIFVJTlQgbnVtT3V0cHV0Q2hhbm5lbHMsIC8qISB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgY29yZSBjb2RlciAqLwogICAgICAgIFVJTlQgc2FtcGxlUmF0ZUlucHV0LCAgIC8qISB0aGUgaW5wdXQgc2FtcGxlIHJhdGUgW2luIEh6XSAqLwogICAgICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgIC8qISB0aGUgY29yZSdzIHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlCiAgICAgICAgKQp7CiAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOwoKICBpZiAoc2FtcGxlUmF0ZUlucHV0IDwgMTYwMDApCiAgICByZXR1cm4gMDsKCiAgaWYgKGJpdHJhdGU9PTApIHsKICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICBpZiAodmJyTW9kZSA8IDMwKQogICAgICBiaXRyYXRlID0gMjQwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNDApCiAgICAgIGJpdHJhdGUgPSAyODAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA2MCkKICAgICAgYml0cmF0ZSA9IDMyMDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDc1KQogICAgICBiaXRyYXRlID0gNDAwMDA7CiAgICBlbHNlCiAgICAgIGJpdHJhdGUgPSA0ODAwMDsKICAgIGJpdHJhdGUgKj0gbnVtT3V0cHV0Q2hhbm5lbHM7CiAgfQoKICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdHJhdGUsIG51bU91dHB1dENoYW5uZWxzLCBzYW1wbGVSYXRlQ29yZSwgY29yZSwgTlVMTCk7CgogIHJldHVybiAoaWR4ID09IElOVkFMSURfVEFCTEVfSURYID8gMCA6IDEpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCgogIFxicmllZiAgQWRqdXN0cyB0aGUgU0JSIHNldHRpbmdzIGFjY29yZGluZyB0byB0aGUgY2hvc2VuIGNvcmUgY29kZXIKICAgICAgICAgIHNldHRpbmdzIHdoaWNoIGFyZSBhY2Nlc3NpYmxlIHZpYSBjb25maWctPmNvZGVjU2V0dGluZ3MKCiAgXHJldHVybiBBIGZsYWcgaW5kaWNhdGluZyBzdWNjZXNzOiB5ZXMgKDEpIG9yIG5vICgwKQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVJTlQKRkRLc2JyRW5jX0FkanVzdFNiclNldHRpbmdzIChjb25zdCBzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywgLyohIG91dHB1dCwgbW9kaWZpZWQgKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgYml0UmF0ZSwgICAgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCiAgICAgICAgICAgICAgICAgICBVSU5UIG51bUNoYW5uZWxzLCAgICAgICAgIC8qISB0aGUgY29yZSBjb2RlciBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZUNvcmUsICAgICAgLyohIHRoZSBjb3JlIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgc2FtcGxlUmF0ZVNiciwgICAgICAgLyohIHRoZSBzYnIgY29kZXIgc2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwogICAgICAgICAgICAgICAgICAgVUlOVCB0cmFuc0ZhYywgICAgICAgICAgICAvKiEgdGhlIHNob3J0IGJsb2NrIHRvIGxvbmcgYmxvY2sgcmF0aW8gKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgc3RhbmRhcmRCaXRyYXRlLCAgICAgLyohIHRoZSBzdGFuZGFyZCBiaXRyYXRlIHBlciBjaGFubmVsIGluIGJpdHMvc2VjICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHZick1vZGUsICAgICAgICAgICAgIC8qISB0aGUgdmJyIHBhcmFtdGVyLCAwIHBvb3IgcXVhbGl0eSAuLiAxMDAgaGlnaCBxdWFsaXR5Ki8KICAgICAgICAgICAgICAgICAgIFVJTlQgdXNlU3BlZWNoQ29uZmlnLCAgICAgLyohPCBhZGFwdCB0dW5pbmcgcGFyYW1ldGVycyBmb3Igc3BlZWNoID8gKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgbGNzTW9kZSwgICAgICAgICAgICAgLyohIHRoZSBsb3cgY29tcGxleGl0eSBzdGVyZW8gbW9kZSAqLwogICAgICAgICAgICAgICAgICAgVUlOVCBiUGFyYW1ldHJpY1N0ZXJlbywgICAvKiE8IHVzZSBwYXJhbWV0cmljIHN0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZSkgICAvKiBDb3JlIGF1ZGlvIGNvZGVjIG9iamVjdCB0eXBlICovCnsKICBJTlQgaWR4ID0gSU5WQUxJRF9UQUJMRV9JRFg7CiAgLyogc2V0IHRoZSBjb3JlIGNvZGVjIHNldHRpbmdzICovCiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLmJpdFJhdGUgICAgICAgICA9IGJpdFJhdGU7CiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyAgICAgICA9IG51bUNoYW5uZWxzOwogIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxICAgICAgPSBzYW1wbGVSYXRlQ29yZTsKICBjb25maWctPmNvZGVjU2V0dGluZ3MudHJhbnNGYWMgICAgICAgID0gdHJhbnNGYWM7CiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnN0YW5kYXJkQml0cmF0ZSA9IHN0YW5kYXJkQml0cmF0ZTsKCiAgaWYgKGJpdFJhdGU9PTApIHsKICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICBpZiAodmJyTW9kZSA8IDMwKQogICAgICBiaXRSYXRlID0gMjQwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNDApCiAgICAgIGJpdFJhdGUgPSAyODAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA2MCkKICAgICAgYml0UmF0ZSA9IDMyMDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDc1KQogICAgICBiaXRSYXRlID0gNDAwMDA7CiAgICBlbHNlCiAgICAgIGJpdFJhdGUgPSA0ODAwMDsKICAgIGJpdFJhdGUgKj0gbnVtQ2hhbm5lbHM7CiAgICAvKiBmaXggdG8gZW5hYmxlIG1vbm8gdmJyTW9kZTw0MCBAIDQ0LjEgb2YgNDhrSHogKi8KICAgIGlmIChudW1DaGFubmVscz09MSkgewogICAgICBpZiAoc2FtcGxlUmF0ZVNicj09NDQxMDAgfHwgc2FtcGxlUmF0ZVNicj09NDgwMDApIHsKICAgICAgICBpZiAodmJyTW9kZTw0MCkgYml0UmF0ZSA9IDMyMDAwOwogICAgICB9CiAgICB9CiAgfQoKICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsbnVtQ2hhbm5lbHMsc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOwoKICBpZiAoaWR4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7CiAgICBjb25maWctPnN0YXJ0RnJlcSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxIDsKICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdG9wRnJlcSA7CiAgICBpZiAodXNlU3BlZWNoQ29uZmlnKSB7CiAgICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxU3BlZWNoOwogICAgICBjb25maWctPnN0b3BGcmVxICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxU3BlZWNoOwogICAgfQoKICAgIC8qIEFkYXB0IHN0b3AgZnJlcXVlbmN5IGluIGNhc2Ugb2YgZG93bnNhbXBsZWQgU0JSIC0gb25seSAzMiBiYW5kcyB0aGVuICovCiAgICBpZiAoMSA9PSBjb25maWctPmRvd25TYW1wbGVGYWN0b3IpIHsKICAgICAgSU5UIGRzU3RvcEZyZXEgPSBGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zdGFydEZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0b3BGcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICBpZiAoZHNTdG9wRnJlcSA8IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgY29uZmlnLT5zdG9wRnJlcSA9IGRzU3RvcEZyZXE7CiAgICB9CgogICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm51bU5vaXNlQmFuZHMgOwogICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpCiAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfMV81OwogICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0PSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlRmxvb3JPZmZzZXQ7CgogICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWwgOwogICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0ZXJlb01vZGUgOwogICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLmZyZXFTY2FsZSA7CgogICAgLyogYWRqdXN0IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIGRlcGVuZGVudCBvbiBiaXRyYXRlIGFuZCBzcGVlY2ggY29uZmlnIGZsYWcgKi8KICAgIGlmICh1c2VTcGVlY2hDb25maWcpCiAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwoKICAgIGlmIChjb3JlID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICAgIGlmIChiaXRSYXRlIDwgMjgwMDApCiAgICAgICAgY29uZmlnLT5pbml0X2FtcF9yZXNfRkYgPSBTQlJfQU1QX1JFU18zXzA7CiAgICAgIGNvbmZpZy0+U2VuZEhlYWRlckRhdGFUaW1lID0gLTE7CiAgICB9CgogICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKICAgICAgaWYgKGJpdFJhdGUgPCAxNjAwMCkgewogICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKGJpdFJhdGUgPCAyMDAwMCkgewogICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwogICAgICB9CiAgICB9CgogICAgY29uZmlnLT51c2VTcGVlY2hDb25maWcgPSB1c2VTcGVlY2hDb25maWc7CgogICAgLyogUFMgc2V0dGluZ3MgKi8KICAgIGNvbmZpZy0+YlBhcmFtZXRyaWNTdGVyZW8gPSBiUGFyYW1ldHJpY1N0ZXJlbzsKCiAgICByZXR1cm4gMSA7CiAgfQogIGVsc2UgewogICAgcmV0dXJuIDAgOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzCiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHRoZSBTQlIgY29uZmlmdXJhdGlvbgogcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKIGlucHV0OiAgICAgICAgLSBjb3JlIGNvZGVjIHR5cGUsCiAgICAgICAgICAgICAgIC0gZmFjdG9yIG9mIFNCUiB0byBjb3JlIGZyYW1lIGxlbmd0aCwKICAgICAgICAgICAgICAgLSBjb3JlIGZyYW1lIGxlbmd0aAogb3V0cHV0OiAgICAgICBpbml0aWFsaXplZCBTQlIgY29uZmlndXJhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVSU5UCkZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMgKHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGRvd25TYW1wbGVGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgY29kZWNHcmFudWxlTGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgaWYgKCAoZG93blNhbXBsZUZhY3RvciA8IDEgfHwgZG93blNhbXBsZUZhY3RvciA+IDIpIHx8CiAgICAgICAgIChjb2RlY0dyYW51bGVMZW4qZG93blNhbXBsZUZhY3RvciA+IFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMpICkKICAgICAgIHJldHVybigwKTsgLyogZXJyb3IgKi8KCiAgICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSAgICAgPSAxMDAwOwogICAgY29uZmlnLT51c2VXYXZlQ29kaW5nICAgICAgICAgID0gMDsKICAgIGNvbmZpZy0+Y3JjU2JyICAgICAgICAgICAgICAgICA9IDA7CiAgICBjb25maWctPmR5bkJ3U3VwcG9ydGVkICAgICAgICAgPSAxOwogICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICAgID0gMTMwMDA7CiAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgICAgICAgPSAxOwoKICAgIGNvbmZpZy0+c2JyRnJhbWVTaXplICAgICAgICAgICA9IGNvZGVjR3JhbnVsZUxlbiAqIGRvd25TYW1wbGVGYWN0b3I7CiAgICBjb25maWctPmRvd25TYW1wbGVGYWN0b3IgICAgICAgPSBkb3duU2FtcGxlRmFjdG9yOwoKICAgIC8qIHNiciBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KICAgIGNvbmZpZy0+c2JyX2RhdGFfZXh0cmEgICAgICAgICA9IDA7CiAgICBjb25maWctPmFtcF9yZXMgICAgICAgICAgICAgICAgPSBTQlJfQU1QX1JFU18zXzAgOwogICAgY29uZmlnLT50cmFuX2ZjICAgICAgICAgICAgICAgID0gMCA7CiAgICBjb25maWctPnRyYW5fZGV0X21vZGUgICAgICAgICAgPSAxIDsKICAgIGNvbmZpZy0+c3ByZWFkICAgICAgICAgICAgICAgICA9IDEgOwogICAgY29uZmlnLT5zdGF0ICAgICAgICAgICAgICAgICAgID0gMCA7CiAgICBjb25maWctPmUgICAgICAgICAgICAgICAgICAgICAgPSAxIDsKICAgIGNvbmZpZy0+ZGVsdGFUQWNyb3NzRnJhbWVzICAgICA9IDEgOwogICAgY29uZmlnLT5kRl9lZGdlXzFzdEVudiAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOwogICAgY29uZmlnLT5kRl9lZGdlX2luY3IgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOwoKICAgIGNvbmZpZy0+c2JyX2ludmZfbW9kZSAgID0gSU5WRl9TV0lUQ0hFRDsKICAgIGNvbmZpZy0+c2JyX3hwb3NfbW9kZSAgID0gWFBPU19MQzsKICAgIGNvbmZpZy0+c2JyX3hwb3NfY3RybCAgID0gU0JSX1hQT1NfQ1RSTF9ERUZBVUxUOwogICAgY29uZmlnLT5zYnJfeHBvc19sZXZlbCAgPSAwOwogICAgY29uZmlnLT51c2VTYVBhbiAgICAgICAgPSAwOwogICAgY29uZmlnLT5keW5Cd0VuYWJsZWQgICAgPSAwOwoKCiAgICAvKiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MoKSBmdW5jdGlvbiBzaW5jZQogICAgICAgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIHR1bmluZyB0YWJsZSAqLwogICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgICAgICAgID0gU0JSX1NXSVRDSF9MUkM7CiAgICBjb25maWctPmFuYV9tYXhfbGV2ZWwgICAgICAgICAgPSA2OwogICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0ICAgICAgID0gMDsKICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICAgICAgICAgICA9IDU7IC8qICA1LjkgcmVzcGVjdGl2ZWx5ICA2LjAga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICAgICAgICAgICA9IDk7IC8qIDE2LjIgcmVzcGVjdGl2ZWx5IDE2Ljgga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KCgogICAgLyogaGVhZGVyX2V4dHJhXzEgKi8KICAgIGNvbmZpZy0+ZnJlcVNjYWxlICAgICAgID0gU0JSX0ZSRVFfU0NBTEVfREVGQVVMVDsKICAgIGNvbmZpZy0+YWx0ZXJTY2FsZSAgICAgID0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl9ub2lzZV9iYW5kcyA9IFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUOwoKICAgIC8qIGhlYWRlcl9leHRyYV8yICovCiAgICBjb25maWctPnNicl9saW1pdGVyX2JhbmRzICAgID0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVDsKICAgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfZ2FpbnMgICAgPSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUOwogICAgY29uZmlnLT5zYnJfaW50ZXJwb2xfZnJlcSAgICA9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVDsKCiAgICByZXR1cm4gMTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRGVsZXRlRW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICBmcmVlcyBtZW1vcnkgb2Ygb25lIFNCUiBjaGFubmVsCiByZXR1cm5zOiAgICAgIC0KIGlucHV0OiAgICAgICAgaGFuZGxlIG9mIGNoYW5uZWwKIG91dHB1dDogICAgICAgcmVsZWFzZWQgaGFuZGxlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZGVsZXRlRW52Q2hhbm5lbCAoSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDdXQpCnsKICBpZiAoaEVudkN1dCkgewoKICAgIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKCZoRW52Q3V0LT5Ub25Db3JyKTsKCiAgICBGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlICgmaEVudkN1dC0+c2JyRXh0cmFjdEVudmVsb3BlKTsKICB9Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZQogZGVzY3JpcHRpb246ICBjbG9zZSB0aGUgY2hhbm5lbCBjb2RpbmcgaGFuZGxlCiByZXR1cm5zOgogaW5wdXQ6ICAgICAgICBwaFNickNoYW5uZWwKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWwpCnsKICBpZiAoaFNickNoYW5uZWwgIT0gTlVMTCkKICB7CiAgICBkZWxldGVFbnZDaGFubmVsICgmaFNickNoYW5uZWwtPmhFbnZDaGFubmVsKTsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UKIGRlc2NyaXB0aW9uOiAgY2xvc2UgdGhlIGNoYW5uZWwgY29kaW5nIGhhbmRsZQogcmV0dXJuczoKIGlucHV0OiAgICAgICAgcGhTYnJDaGFubmVsCiBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoSEFORExFX1NCUl9FTEVNRU5UICpwaFNickVsZW1lbnQpCnsKICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSAqcGhTYnJFbGVtZW50OwoKICBpZiAoaFNickVsZW1lbnQhPU5VTEwpIHsKICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKQogICAgICBGcmVlUmFtX1Nicl92X2tfbWFzdGVyKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKTsKICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSkKICAgICAgRnJlZVJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSk7CiAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pCiAgICAgIEZyZWVSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pOwoKICAgIEZyZWVSYW1fU2JyRWxlbWVudChwaFNickVsZW1lbnQpOwogIH0KICByZXR1cm4gOwoKfQoKCnZvaWQgc2JyRW5jb2Rlcl9DbG9zZSAoSEFORExFX1NCUl9FTkNPREVSICpwaFNickVuY29kZXIpCnsKICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSAqcGhTYnJFbmNvZGVyOwoKICBpZiAoaFNickVuY29kZXIgIT0gTlVMTCkKICB7CiAgICBpbnQgZWwsIGNoOwoKICAgIGZvciAoZWw9MDsgZWw8KDgpOyBlbCsrKQogICAgewogICAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdIT1OVUxMKSB7CiAgICAgICAgc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSk7CiAgICAgIH0KICAgIH0KCiAgICAvKiBDbG9zZSBzYnIgQ2hhbm5lbHMgKi8KICAgIGZvciAoY2g9MDsgY2g8KDgpOyBjaCsrKQogICAgewogICAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSkgewogICAgICAgIHNickVuY29kZXJfQ2hhbm5lbENsb3NlKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtjaF0pOwogICAgICAgIEZyZWVSYW1fU2JyQ2hhbm5lbCgmaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSk7CiAgICAgIH0KCiAgICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbY2hdLkZpbHRlclN0YXRlcykKICAgICAgICBGcmVlUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcygoRklYUF9RQVMqKikmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2NoXS5GaWx0ZXJTdGF0ZXMpOwoKCiAgICB9CgogICAgaWYgKGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykKICAgICAgUFNFbmNfRGVzdHJveSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKQogICAgICBGcmVlUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzKChGSVhQX0RCTCoqKSZoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKTsKCiAgICAvKiBSZWxlYXNlIE92ZXJsYXkgKi8KICAgIEZyZWVSYW1fU2JyRHluYW1pY19SQU0oKEZJWFBfREJMKiopJmhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0pOwoKCiAgICBGcmVlUmFtX1NickVuY29kZXIocGhTYnJFbmNvZGVyKTsKICB9Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IHVwZGF0ZUZyZXFCYW5kVGFibGUKIGRlc2NyaXB0aW9uOiAgdXBkYXRlcyB2a19tYXN0ZXIKIHJldHVybnM6ICAgICAgLQogaW5wdXQ6ICAgICAgICBjb25maWcgaGFuZGxlCiBvdXRwdXQ6ICAgICAgIGVycm9yIGluZm8KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIHVwZGF0ZUZyZXFCYW5kVGFibGUoCiAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBzYnJIZWFkZXJEYXRhLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGRvd25TYW1wbGVGYWN0b3IKICAgICAgICApCnsKICBJTlQgazAsIGsyOwoKICBpZiggRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kICgKICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gKGRvd25TYW1wbGVGYWN0b3ItMSksCiAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAogICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKICAgICAgICAgICAgICZrMCwKICAgICAgICAgICAgICZrMgogICAgICAgICAgICAgICkKICAgICkKICAgIHJldHVybigxKTsKCgogIGlmKCBGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCiAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKICAgICAgICAgICAgICBrMCwKICAgICAgICAgICAgICBrMiwKICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCiAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZQogICAgICAgICAgICAgICkKICAgICkKICAgIHJldHVybigxKTsKCgogIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kPTA7CgoKICBpZiggRkRLc2JyRW5jX1VwZGF0ZUhpUmVzKAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldLAogICAgICAgICAgICAgICZzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSwKICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCiAgICAgICAgICAgICAgJnNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kCiAgICAgICAgICAgICAgKQogICAgKQogICAgcmV0dXJuKDEpOwoKCiAgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKAogICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtMT10sCiAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltMT10sCiAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXSwKICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5TZmJbSEldCiAgICAgICAgICApOwoKCiAgc2JyQ29uZmlnRGF0YS0+eE92ZXJGcmVxID0gKHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9XX1JFU11bMF0gKiBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxIC8gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcysxKT4+MTsKCiAgcmV0dXJuICgwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogcmVzZXRFbnZDaGFubmVsCiBkZXNjcmlwdGlvbjogIHJlc2V0cyBwYXJhbWV0ZXJzIGFuZCBhbGxvY2F0ZXMgbWVtb3J5CiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIHJlc2V0RW52Q2hhbm5lbCAoSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICBoRW52KQp7CiAgLyogbm90ZSAhISEgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgaW4gZnVuY3Rpb24gRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSAhISEqLwogIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vaXNlQmFuZHMgPSAgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzOwoKCiAgaWYoRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5udW1fTWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKSkKICAgIHJldHVybigxKTsKCiAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltMT10gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CiAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltISV0gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CgogIGhFbnYtPnNickNvZGVFbnZlbG9wZS5uU2ZiW0xPXSA9IHNickNvbmZpZ0RhdGEtPm5TZmJbTE9dOwogIGhFbnYtPnNickNvZGVFbnZlbG9wZS5uU2ZiW0hJXSA9IHNickNvbmZpZ0RhdGEtPm5TZmJbSEldOwoKICBoRW52LT5lbmNFbnZEYXRhLm5vSGFybW9uaWNzID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CgogIGhFbnYtPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOwogIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CgogIHJldHVybiAoMCk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEBmbgogKiBAYnJpZWYgICAgICAgY2FsY3VsYXRlcyB0aGUgY2xvc2VzdCBwb3NzaWJsZSBjcm9zc292ZXIgZnJlcXVlbmN5CiAqIEByZXR1cm4gICAgICB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSBTQlIgYWNjZXB0cwogKgogKi8Kc3RhdGljIElOVApGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKEhBTkRMRV9TQlJfRUxFTUVOVCAgaEVudiwgICAgICAgIC8qITwgaGFuZGxlIHRvIFNCUiBlbmNvZGVyIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICB4b3ZlckZyZXEpICAgLyohPCBmcm9tIGNvcmUgY29kZXIgc3VnZ2VzdGVkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KewogIElOVCBiYW5kOwogIElOVCBsYXN0RGlmZiwgbmV3RGlmZjsKICBJTlQgY3V0b2ZmU2I7CgogIFVDSEFSICpSRVNUUklDVCBwVktNYXN0ZXIgPSBoRW52LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXI7CgogIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgY3V0b2ZmIGZyZXF1ZW5jeSBpbiB0aGUgbWFzdGVyIHRhYmxlICovCiAgY3V0b2ZmU2IgPSAoNCp4b3ZlckZyZXEgKiBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgLyBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgKyAxKT4+MTsKICBsYXN0RGlmZiA9IGN1dG9mZlNiOwogIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBoRW52LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXI7IGJhbmQrKykgewoKICAgIG5ld0RpZmYgPSBmaXhwX2FicygoSU5UKXBWS01hc3RlcltiYW5kXSAtIGN1dG9mZlNiKTsKCiAgICBpZihuZXdEaWZmID49IGxhc3REaWZmKSB7CiAgICAgIGJhbmQtLTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgbGFzdERpZmYgPSBuZXdEaWZmOwogIH0KCiAgcmV0dXJuICgocFZLTWFzdGVyW2JhbmRdICogaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxL2hFbnYtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcysxKT4+MSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lCiBkZXNjcmlwdGlvbjogcGVyZm9ybXMgdGhlIHNiciBlbnZlbG9wZSBjYWxjdWxhdGlvbiBmb3Igb25lIGVsZW1lbnQKIHJldHVybnM6CiBpbnB1dDoKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJTlQKRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhFbnZFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpzYW1wbGVzLCAgICAgICAgICAgICAgICAgLyohPCB0aW1lIHNhbXBsZXMsIGFsd2F5cyBpbnRlcmxlYXZlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLCAgICAgICAgICAgIC8qITwgdGltZSBidWZmZXIgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc3RyaWRlICovCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpzYnJEYXRhQml0cywgICAgICAgICAgICAgLyohPCBTaXplIG9mIFNCUiBwYXlsb2FkICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAqc2JyRGF0YSwgICAgICAgICAgICAgICAgIC8qITwgU0JSIHBheWxvYWQgICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dCAgICAgICAgICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLwogICAgICAgICAgICAgICAgICAgICAgICApCnsKICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSBOVUxMOwogIEZES19DUkNJTkZPICBjcmNJbmZvOwogIElOVCAgICBjcmNSZWc7CiAgSU5UICAgIGNoOwogIElOVCAgICBiYW5kOwogIElOVCAgICBjdXRvZmZTYjsKICBJTlQgICAgbmV3WE92ZXI7CgogIGlmIChoRW52RW5jb2RlciA9PSBOVUxMKQogICAgcmV0dXJuIC0xOwoKICBoU2JyRWxlbWVudCA9IGhFbnZFbmNvZGVyLT5zYnJFbGVtZW50W2lFbGVtZW50XTsKCiAgaWYgKGhTYnJFbGVtZW50ID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgoKICAvKiBoZWFkZXIgYml0c3RyZWFtIGhhbmRsaW5nICovCiAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhID0gJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhOwoKICBJTlQgcHNIZWFkZXJBY3RpdmUgPSAwOwogIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSA9IDA7CgogIC8qIEFudGljaXBhdGUgUFMgaGVhZGVyIGJlY2F1c2Ugb2YgaW50ZXJuYWwgUFMgYml0c3RyZWFtIGRlbGF5IGluIG9yZGVyIHRvIGJlIGluIHN5bmMgd2l0aCBTQlIgaGVhZGVyLiAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09KHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEtMSkgKQogIHsKICAgICAgcHNIZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogU2lnbmFsIFNCUiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBpbnRvIGJpdHN0cmVhbSAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09MCAgKQogIHsKICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogSW5jcmVtZW50IGhlYWRlciBpbnRlcnZhbCBjb3VudGVyICovCiAgaWYgKHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEgPT0gMCkgewogICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9IDE7CiAgfQogIGVsc2UgewogICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPj0gMCkgewogICAgICBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhKys7CiAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgJT0gc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YTsKICAgIH0KICB9CgogIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkICkgewogICAgSU5UIGk7CiAgICBmb3IgKCBpID0gNDsgaSA+IDA7IGktLSApCiAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpLTFdOwoKICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVswXSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmM7CiAgICBpZiAoaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdID4gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzJdKQogICAgICBuZXdYT3ZlciA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVsyXTsKICAgIGVsc2UKICAgICAgbmV3WE92ZXIgPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMV07CgogICAgLyogaGFzIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5IGNoYW5nZWQ/ICovCiAgICBpZiAoIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSAhPSBuZXdYT3ZlciApIHsKCiAgICAgIC8qIGdldCBjb3JyZXNwb25kaW5nIG1hc3RlciBiYW5kICovCiAgICAgIGN1dG9mZlNiID0gKCg0KiBuZXdYT3ZlciAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKICAgICAgICAgICAgICAgICAgLyBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxKSsxKT4+MTsKCiAgICAgIGZvciAoIGJhbmQgPSAwOyBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrICkgewogICAgICAgIGlmICggY3V0b2ZmU2IgPT0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudl9rX21hc3RlcltiYW5kXSApCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBGREtfQVNTRVJUKCBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlciApOwoKICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gbmV3WE92ZXI7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gYmFuZDsKICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlPTE7CiAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsgLyogcHMgaGVhZGVyIGlzIG9uZSBmcmFtZSBkZWxheWVkICovCgogICAgICAvKgogICAgICAgIHVwZGF0ZSB2a19tYXN0ZXIgdGFibGUKICAgICAgKi8KICAgICAgaWYodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICByZXR1cm4oMSk7CgoKICAgICAgLyogcmVzZXQgU0JSIGNoYW5uZWxzICovCiAgICAgIElOVCBuRW52Q2ggPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CiAgICAgIGZvciAoIGNoID0gMDsgY2ggPCBuRW52Q2g7IGNoKysgKSB7CiAgICAgICAgaWYocmVzZXRFbnZDaGFubmVsICgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCkpCiAgICAgICAgICByZXR1cm4oMSk7CgogICAgICB9CiAgICB9CiAgfQoKICAvKgogICAgYWxsb2NhdGUgc3BhY2UgZm9yIGR1bW15IGhlYWRlciBhbmQgY3JjCiAgKi8KICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBWUxPQURfU0laRSpzaXplb2YoVUNIQVIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CgogIC8qIFRlbXBvcmFsIEVudmVsb3BlIERhdGEgKi8KICBTQlJfRlJBTUVfVEVNUF9EQVRBIF9mRGF0YTsKICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSA9ICZfZkRhdGE7CiAgU0JSX0VOVl9URU1QX0RBVEEgZURhdGFbTUFYX05VTV9DSEFOTkVMU107CgogIC8qIEluaXQgVGVtcG9yYWwgRW52ZWxvcGUgRGF0YSAqLwogIHsKICAgIGludCBpOwoKICAgIEZES21lbWNsZWFyKCZlRGF0YVswXSwgc2l6ZW9mKFNCUl9FTlZfVEVNUF9EQVRBKSk7CiAgICBGREttZW1jbGVhcigmZURhdGFbMV0sIHNpemVvZihTQlJfRU5WX1RFTVBfREFUQSkpOwogICAgRkRLbWVtY2xlYXIoZkRhdGEsIHNpemVvZihTQlJfRlJBTUVfVEVNUF9EQVRBKSk7CgogICAgZm9yKGk9MDsgaTxNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICBmRGF0YS0+cmVzW2ldID0gRlJFUV9SRVNfSElHSDsKICB9CgoKICBpZiAoIWNsZWFyT3V0cHV0KQogIHsKICAgIC8qCiAgICAgKiBUcmFuc2Zvcm0gYXVkaW8gZGF0YSBpbnRvIFFNRiBkb21haW4KICAgICAqLwogICAgZm9yKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4gPSAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbDsKICAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaF9lbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CgogICAgICBpZihoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDApCiAgICAgIHsKICAgICAgICBRTUZfU0NBTEVfRkFDVE9SIHRtcFNjYWxlOwogICAgICAgIEZJWFBfREJMICoqcFFtZlJlYWwsICoqcFFtZkltYWc7CiAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKjIpCgoKICAgICAgICAvKiBPYnRhaW4gcG9pbnRlcnMgdG8gUU1GIGJ1ZmZlcnMuICovCiAgICAgICAgcFFtZlJlYWwgPSBzYnJFeHRyRW52LT5yQnVmZmVyOwogICAgICAgIHBRbWZJbWFnID0gc2JyRXh0ckVudi0+aUJ1ZmZlcjsKCiAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZlJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZldvcmtCdWZmZXIgKTsKCiAgICAgICAgaF9lbnZDaGFuLT5xbWZTY2FsZSA9IHRtcFNjYWxlLmxiX3NjYWxlICsgNzsKCgogICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZldvcmtCdWZmZXIsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqMikKCiAgICAgIH0gLyogZlBhcmFtZXRyaWNTdGVyZW8gPT0gMCAqLwoKCiAgICAgIC8qCiAgICAgICAgUGFyYW1ldHJpYyBTdGVyZW8gcHJvY2Vzc2luZwogICAgICAqLwogICAgICBpZiAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbykKICAgICAgewogICAgICAgIElOVCBlcnJvciA9IG5vRXJyb3I7CgoKICAgICAgICAvKiBMaW1pdCBQYXJhbWV0cmljIFN0ZXJlbyB0byBvbmUgaW5zdGFuY2UgKi8KICAgICAgICBGREtfQVNTRVJUKGNoID09IDApOwoKCiAgICAgICAgaWYoZXJyb3IgPT0gbm9FcnJvcil7CiAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBwcm9jZXNzaW5nOgogICAgICAgICAgICAgLSBpbnB1dDoKICAgICAgICAgICAgICAgbyBsZWZ0IGFuZCByaWdodCB0aW1lIGRvbWFpbiBzYW1wbGVzCiAgICAgICAgICAgICAtIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAgIG8gc3RlcmVvIHFtZiBhbmFseXNpcwogICAgICAgICAgICAgICBvIHN0ZXJlbyBoeWJyaWQgYW5hbHlzaXMKICAgICAgICAgICAgICAgbyBwcyBwYXJhbWV0ZXIgZXh0cmFjdGlvbgogICAgICAgICAgICAgICBvIGRvd25taXggKyBoeWJyaWQgc3ludGhlc2lzCiAgICAgICAgICAgICAtIG91dHB1dDoKICAgICAgICAgICAgICAgbyBkb3dubWl4ZWQgcW1mIGRhdGEgaXMgd3JpdHRlbiB0byBzYnJFeHRyRW52LT5yQnVmZmVyIGFuZCBzYnJFeHRyRW52LT5pQnVmZmVyCiAgICAgICAgICAqLwogICAgICAgICAgU0NIQVIgcW1mU2NhbGU7CiAgICAgICAgICBJTlRfUENNKiBwU2FtcGxlc1syXSA9IHtzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMF0sc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4WzFdfTsKICAgICAgICAgIGVycm9yID0gRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKCBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkVuY29kZXItPnFtZlN5bnRoZXNpc1BTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFtZlNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzSGVhZGVyQWN0aXZlICk7CiAgICAgICAgICBpZiAobm9FcnJvciAhPSBlcnJvcikKICAgICAgICAgIHsKICAgICAgICAgICAgZXJyb3IgPSBoYW5kQmFjayhlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gKGludClxbWZTY2FsZTsKICAgICAgICB9CgoKICAgICAgfSAvKiBpZiAoaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSAqLwoKICAgICAgLyoKCiAgICAgICAgIEV4dHJhY3QgRW52ZWxvcGUgcmVsZXZhbnQgdGhpbmdzIGZyb20gUU1GIGRhdGEKCiAgICAgICovCiAgICAgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZURhdGFbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgIH0gLyogaEVudkVuY29kZXItPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzICovCiB9CgogIC8qCiAgICAgUHJvY2VzcyBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgYW5kIGNhbGN1bGF0ZSBlbnZlbG9wZSBkYXRhIGFuZCB3cml0ZSBwYXlsb2FkCiAgKi8KICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKSA/IGhFbnZFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbyA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsWzFdLT5oRW52Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAvKgogICAgZm9ybWF0IHBheWxvYWQsIGNhbGN1bGF0ZSBjcmMKICAqLwogIEZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLCAmY3JjSW5mbywgY3JjUmVnLCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CgogIC8qCiAgICBzYXZlIG5ldyBwYXlsb2FkLCBzZXQgdG8gemVybyBsZW5ndGggaWYgZ3JlYXRlciB0aGFuIE1BWF9QQVlMT0FEX1NJWkUKICAqLwogIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSA9IEZES2dldFZhbGlkQml0cygmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1Zik7CgogIGlmKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSA+IChNQVhfUEFZTE9BRF9TSVpFPDwzKSkKICAgIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XT0wOwoKICAvKiBXaGlsZSBmaWxsaW5nIHRoZSBEZWxheSBsaW5lcywgc2JyRGF0YSBpcyBOVUxMICovCiAgaWYgKHNickRhdGEpIHsKICAgICpzYnJEYXRhQml0cyA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXTsKICAgIEZES21lbWNweShzYnJEYXRhLCBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVswXSwgKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSs3KT4+Myk7CgoKICB9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIGlmIChoRW52RW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCiAgewogICAgaW50IGNoOwogICAgaW50IG5DaGFubmVscyA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKCiAgICBmb3IgKGNoPTA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgewogICAgICBJTlQgbk91dFNhbXBsZXM7CgogICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKyBoRW52RW5jb2Rlci0+YnVmZmVyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5PdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuY29kZXItPm5DaGFubmVscyk7CiAgICB9CiAgfSAvKiBkb3duc2FtcGxlICovCgoKICByZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IGNyZWF0ZUVudkNoYW5uZWwKIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcGFyYW1ldGVycyBhbmQgYWxsb2NhdGVzIG1lbW9yeQogcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKIGlucHV0Ogogb3V0cHV0OiAgICAgICBoRW52CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBJTlQKY3JlYXRlRW52Q2hhbm5lbCAoSEFORExFX0VOVl9DSEFOTkVMICAgICBoRW52LAogICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwKICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgICAgICAgICAgICBkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICkKewogIEZES21lbWNsZWFyKGhFbnYsc2l6ZW9mIChzdHJ1Y3QgRU5WX0NIQU5ORUwpKTsKCiAgaWYgKCBGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKSApCiAgewogICAgcmV0dXJuKDEpOwogIH0KCiAgaWYgKCBGREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlICgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsLypjaGFuKi8wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKICB7CiAgICByZXR1cm4oMSk7CiAgfQoKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBpbml0RW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzCiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAppbml0RW52Q2hhbm5lbCAoICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICBoRW52LAogICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICAgICAgICAgICxJTlQgICAgICAgICAgICAgICAgICAgIGNoYW5JbkVsCiAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgICAgICAgICAgICAgZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICApCnsKICBpbnQgZnJhbWVTaGlmdCwgdHJhbl9vZmY9MDsKICBJTlQgZTsKICBJTlQgdHJhbl9mYzsKICBJTlQgdGltZVNsb3RzLCB0aW1lU3RlcCwgc3RhcnRJbmRleDsKICBJTlQgbm9pc2VCYW5kc1syXSA9IHsgMywgMyB9OwoKICBlID0gMSA8PCBwYXJhbXMtPmU7CgogIEZES19BU1NFUlQocGFyYW1zLT5lID49IDApOwoKICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeCA9IDE7CiAgaEVudi0+ZkxldmVsUHJvdGVjdCA9IDA7CgogIGhFbnYtPmVuY0VudkRhdGEubGRHcmlkID0gKHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpID8gMSA6IDA7CgogIGhFbnYtPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSA9IChYUE9TX01PREUpcGFyYW1zLT5zYnJfeHBvc19tb2RlOwoKICBpZiAoaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID09IFhQT1NfU1dJVENIRUQpIHsKICAgIC8qCiAgICAgICBubyBvdGhlciB0eXBlIHRoYW4gWFBPU19NRENUIG9yIFhQT1NfU1BFRUNIIGFsbG93ZWQsCiAgICAgICBidXQgZW5hYmxlIHN3aXRjaGluZwogICAgKi8KICAgIHNickNvbmZpZ0RhdGEtPnN3aXRjaFRyYW5zcG9zZXJzID0gVFJVRTsKICAgIGhFbnYtPmVuY0VudkRhdGEuc2JyX3hwb3NfbW9kZSA9IFhQT1NfTURDVDsKICB9CiAgZWxzZSB7CiAgICBzYnJDb25maWdEYXRhLT5zd2l0Y2hUcmFuc3Bvc2VycyA9IEZBTFNFOwogIH0KCiAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19jdHJsID0gcGFyYW1zLT5zYnJfeHBvc19jdHJsOwoKCiAgLyogZXh0ZW5kZWQgZGF0YSAqLwogIGlmKHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZykgewogICAgaEVudi0+ZW5jRW52RGF0YS5leHRlbmRlZF9kYXRhID0gMTsKICB9CiAgZWxzZSB7CiAgICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuZGVkX2RhdGEgPSAwOwogIH0KCiAgaEVudi0+ZW5jRW52RGF0YS5leHRlbnNpb25fc2l6ZSA9IDA7CgogIHN0YXJ0SW5kZXggPSBRTUZfRklMVEVSX1BST1RPVFlQRV9TSVpFIC0gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kczsKCiAgc3dpdGNoIChwYXJhbXMtPnNickZyYW1lU2l6ZSkgewogIGNhc2UgMjMwNDoKICAgIHRpbWVTbG90cyA9IDE4OwogICAgYnJlYWs7CiAgY2FzZSAyMDQ4OgogIGNhc2UgMTAyNDoKICBjYXNlIDUxMjoKICAgIHRpbWVTbG90cyA9IDE2OwogICAgYnJlYWs7CiAgY2FzZSAxOTIwOgogIGNhc2UgOTYwOgogIGNhc2UgNDgwOgogICAgdGltZVNsb3RzID0gMTU7CiAgICBicmVhazsKICBjYXNlIDExNTI6CiAgICB0aW1lU2xvdHMgPSA5OwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIHJldHVybiAoMSk7IC8qIElsbGVnYWwgZnJhbWUgc2l6ZSAqLwogIH0KCiAgdGltZVN0ZXAgPSBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzIC8gdGltZVNsb3RzOwoKICBpZiAoIEZES3NickVuY19Jbml0VG9uQ29yclBhcmFtRXh0cihwYXJhbXMtPnNickZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5Ub25Db3JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c2JyX3hwb3NfY3RybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmFuYV9tYXhfbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+bm9pc2VGbG9vck9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnVzZVNwZWVjaENvbmZpZykgKQogICAgcmV0dXJuKDEpOwoKICBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwoKICBub2lzZUJhbmRzWzBdID0gaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kczsKICBub2lzZUJhbmRzWzFdID0gaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kczsKCiAgaEVudi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID0gKElOVkZfTU9ERSlwYXJhbXMtPnNicl9pbnZmX21vZGU7CgogIGlmIChoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPT0gSU5WRl9TV0lUQ0hFRCkgewogICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfaW52Zl9tb2RlID0gSU5WRl9NSURfTEVWRUw7CiAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gVFJVRTsKICB9CiAgZWxzZSB7CiAgICBoRW52LT5Ub25Db3JyLnN3aXRjaEludmVyc2VGaWx0ID0gRkFMU0U7CiAgfQoKCiAgdHJhbl9mYyAgPSBwYXJhbXMtPnRyYW5fZmM7CgogIGlmICh0cmFuX2ZjID09IDApIHsKICAgIHRyYW5fZmMgPSBmaXhNaW4gKDUwMDAsIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcgKHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3kscGFyYW1zLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXEpKTsKICB9CgogIHRyYW5fZmMgPSAodHJhbl9mYyo0KnNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMvc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSArIDEpPj4xOwoKICBpZiAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgewogICAgZnJhbWVTaGlmdCA9IExEX1BSRVRSQU5fT0ZGOwogICAgdHJhbl9vZmYgPSBMRF9QUkVUUkFOX09GRiArIEZSQU1FX01JRERMRV9TTE9UXzUxMkxEKnRpbWVTdGVwOwogIH0gZWxzZQogIHsKICAgIGZyYW1lU2hpZnQgPSAwOwogICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKICAgICAgLyogVGhlIGZhY3RvciBvZiAyIGlzIGJ5IGRlZmluaXRpb24uICovCiAgICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODogdHJhbl9vZmYgPSA4ICsgRlJBTUVfTUlERExFX1NMT1RfMjA0OCAqIHRpbWVTdGVwOyBicmVhazsKICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOiB0cmFuX29mZiA9IDcgKyBGUkFNRV9NSURETEVfU0xPVF8xOTIwICogdGltZVN0ZXA7IGJyZWFrOwogICAgICBkZWZhdWx0OiByZXR1cm4gMTsKICAgIH0KICB9CiAgaWYgKCBGREtzYnJFbmNfSW5pdEV4dHJhY3RTYnJFbnZlbG9wZSAoJmhFbnYtPnNickV4dHJhY3RFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLCBzdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLCB0aW1lU3RlcCwgdHJhbl9vZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsY2hhbkluRWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICByZXR1cm4oMSk7CgogIGlmKEZES3NickVuY19Jbml0U2JyQ29kZUVudmVsb3BlICgmaEVudi0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZGVsdGFUQWNyb3NzRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlXzFzdEVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZEZfZWRnZV9pbmNyKSkKICAgIHJldHVybigxKTsKCiAgaWYoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKCZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRlbHRhVEFjcm9zc0ZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCkpCiAgICByZXR1cm4oMSk7CgogIHNickNvbmZpZ0RhdGEtPmluaXRBbXBSZXNGRiA9IHBhcmFtcy0+aW5pdF9hbXBfcmVzX0ZGOwoKICBpZihGREtzYnJFbmNfSW5pdFNickh1ZmZtYW5UYWJsZXMgKCZoRW52LT5lbmNFbnZEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudi0+c2JyQ29kZUVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9hbXBfcmVzKSkKICAgcmV0dXJuKDEpOwoKICBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvciAoJmhFbnYtPlNickVudkZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zcHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zdGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoRW52LT5lbmNFbnZEYXRhLmxkR3JpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgaWYoRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvciAoJmhFbnYtPnNiclRyYW5zaWVudERldGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbl9mYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuX29mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogIHJldHVybigxKTsKCgogIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoID0gcGFyYW1zLT5zYnJfeHBvc19jdHJsOwoKICBoRW52LT5lbmNFbnZEYXRhLm5vSGFybW9uaWNzID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CiAgaEVudi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcgPSAwOwoKICByZXR1cm4gKDApOwp9CgpJTlQgc2JyRW5jb2Rlcl9PcGVuKAogICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgKnBoU2JyRW5jb2RlciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUwogICAgICAgICkKewogIElOVCBpOwogIElOVCBlcnJvclN0YXR1cyA9IDE7CiAgSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyID0gTlVMTDsKCiAgaWYgKHBoU2JyRW5jb2Rlcj09TlVMTAogICAgICkKICB7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBoU2JyRW5jb2RlciA9IEdldFJhbV9TYnJFbmNvZGVyKCk7CiAgaWYgKGhTYnJFbmNvZGVyPT1OVUxMKSB7CiAgICBnb3RvIGJhaWw7CiAgfQogIEZES21lbWNsZWFyKGhTYnJFbmNvZGVyLCBzaXplb2YoU0JSX0VOQ09ERVIpKTsKCiAgICAgIGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0gPSAoVUNIQVIqKUdldFJhbV9TYnJEeW5hbWljX1JBTSgpOwogICAgICBoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbSA9IGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU07CgogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXSA9IEdldFJhbV9TYnJFbGVtZW50KGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogICAgRkRLbWVtY2xlYXIoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0sIHNpemVvZihTQlJfRUxFTUVOVCkpOwogICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10gPSAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oaSk7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSA9ICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVISShpKTsKICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIgICAgICAgID0gIEdldFJhbV9TYnJfdl9rX21hc3RlcihpKTsKICAgIGlmICggKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dPT1OVUxMKSB8fAogICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV09PU5VTEwpIHx8CiAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyPT1OVUxMKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgIGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXSA9IEdldFJhbV9TYnJDaGFubmVsKGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXT09TlVMTCkgewogICAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBpZiAoIGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQoKICB9CgogIGZvciAoaT0wOyBpPGZpeE1heChuQ2hhbm5lbHMsKHN1cHBvcnRQUyk/MjowKTsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzID0gR2V0UmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcyhpKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgaWYgKHN1cHBvcnRQUykgewogICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkKICAgIHsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KICB9ICAvKiBzdXBwb3J0UFMgKi8KCiAgKnBoU2JyRW5jb2RlciA9IGhTYnJFbmNvZGVyOwoKICBlcnJvclN0YXR1cyA9IDA7CiAgcmV0dXJuIGVycm9yU3RhdHVzOwoKYmFpbDoKICAvKiBDbG9zZSBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLwogIHNickVuY29kZXJfQ2xvc2UoJmhTYnJFbmNvZGVyKTsKICByZXR1cm4gZXJyb3JTdGF0dXM7Cn0KCnN0YXRpYwpJTlQgRkRLc2JyRW5jX1JlYWxsb2NhdGUoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgbm9FbGVtZW50cykKewogIElOVCB0b3RhbENoID0gMDsKICBJTlQgdG90YWxRbWYgPSAwOwogIElOVCBjb3JlRWw7CiAgSU5UIGVsPS0xOwoKICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSwgdW50aWwgbGZlIGZvdW5kICovCgogIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKICB7CiAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfU0NFIHx8IGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9DUEUpIHsKICAgICAgZWwrKzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfTEZFKSB7CiAgICAgICAgICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSBlbEluZm9bY29yZUVsXS5DaGFubmVsSW5kZXhbMF07CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgU0JSX0VMRU1FTlRfSU5GTyAgICAqcGVsSW5mbyA9ICZlbEluZm9bY29yZUVsXTsKICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CgogICAgaW50IGNoOwogICAgZm9yICggY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKysgKSB7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXSA9IGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFt0b3RhbENoXTsKICAgICAgdG90YWxDaCsrOwogICAgfQogICAgLyogYW5hbHlzaXMgUU1GICovCiAgICBmb3IgKCBjaCA9IDA7IGNoIDwgKChwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsgY2grKyApIHsKICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdID0gcGVsSW5mby0+Q2hhbm5lbEluZGV4W2NoXTsKICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0gPSAmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW3RvdGFsUW1mKytdOwogICAgfQoKICAgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmVsVHlwZSAgICAgICAgICAgID0gcGVsSW5mby0+ZWxUeXBlOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyAgICAgICA9IHBlbEluZm8tPmluc3RhbmNlVGFnOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5uQ2hhbm5lbHNJbkVsICAgICA9IHBlbEluZm8tPm5DaGFubmVsc0luRWw7CiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID0gcGVsSW5mby0+ZlBhcmFtZXRyaWNTdGVyZW87CiAgfSAvKiBjb3JlRWwgKi8KCiAgcmV0dXJuIDA7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfRW52SW5pdAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzCiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMKSU5UIEZES3NickVuY19FbnZJbml0ICgKICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgICBoU2JyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAqY29yZUJhbmRXaXRoLAogICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbkJpdHN0ckRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgICBzdGF0ZXNJbml0RmxhZywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZlRpbWVEb21haW5Eb3duc2FtcGxpbmcKICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAqZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICkKewogIFVDSEFSICAgICpiaXRzdHJlYW1CdWZmZXI7CiAgaW50IGNoLCBpOwoKICBpZiAoKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPCAxKSB8fCAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKXsKICAgIHJldHVybigxKTsKICB9CgogIC8qIGluaXRpYWxpemUgdGhlIGVuY29kZXIgaGFuZGxlICBhbmQgc3RydWN0cyovCiAgYml0c3RyZWFtQnVmZmVyID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbbkJpdHN0ckRlbGF5XTsKCiAgLyogaW5pdCBhbmQgc2V0IHN5bnRheCBmbGFncyAqLwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzID0gMDsKCiAgc3dpdGNoIChhb3QpIHsKICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9MT1dfREVMQVk7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYnJlYWs7CiAgfQogIGlmIChwYXJhbXMtPmNyY1NicikgewogICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9DUkM7CiAgfQoKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzID0gUU1GX0NIQU5ORUxTPj4oMi1wYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IpOwogIHN3aXRjaCAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcykKICB7CiAgICBjYXNlIDY0OiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemU+PjY7CiAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgMzI6IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZT4+NTsKICAgICAgICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cyA9IHBhcmFtcy0+c2JyRnJhbWVTaXplPj42OwogICAgICAgICAgICAgcmV0dXJuKDIpOwogIH0KCiAgRkRLaW5pdEJpdFN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1ZiwgYml0c3RyZWFtQnVmZmVyLCBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksIDAsIEJTX1dSSVRFUik7CgogIC8qCiAgICBub3cgaW5pdGlhbGl6ZSBzYnJDb25maWdEYXRhLCBzYnJIZWFkZXJEYXRhIGFuZCBzYnJCaXRzdHJlYW1EYXRhLAogICovCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKCiAgaWYocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9PSAyKQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBwYXJhbXMtPnN0ZXJlb01vZGU7CiAgZWxzZQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBTQlJfTU9OTzsKCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplICAgPSBwYXJhbXMtPnNickZyYW1lU2l6ZTsKCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSA9IHBhcmFtcy0+ZG93blNhbXBsZUZhY3RvciAqIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxOwoKICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0gMDsKICBpZiAocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgPiAwICkgewoKICAgIGlmIChoZWFkZXJQZXJpb2Q9PS0xKSB7CgogICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMTAwMCAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOwogICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gZml4TWF4KGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEsMSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogYXNzdXJlIGhlYWRlciBwZXJpb2QgYXQgbGVhc3Qgb25jZSBwZXIgc2Vjb25kICovCiAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNaW4oZml4TWF4KGhlYWRlclBlcmlvZCwxKSwoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAwOwogIH0KCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSBwYXJhbXMtPnNicl9kYXRhX2V4dHJhOwogIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZSA9IDA7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA9IHBhcmFtcy0+c3RhcnRGcmVxOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdG9wX2ZyZXF1ZW5jeSAgPSBwYXJhbXMtPnN0b3BGcmVxOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gMDsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGNfc3RlcmVvX21vZGUgPSAwOwoKICAvKiBkYXRhX2V4dHJhICovCiAgaWYgKHBhcmFtcy0+c2JyX3hwb3NfY3RybCE9IFNCUl9YUE9TX0NUUkxfREVGQVVMVCkKICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfZGF0YV9leHRyYSA9IDE7CgogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9hbXBfcmVzID0gKEFNUF9SRVMpcGFyYW1zLT5hbXBfcmVzOwoKICAvKiBoZWFkZXJfZXh0cmFfMSAqLwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmZyZXFTY2FsZSAgPSBwYXJhbXMtPmZyZXFTY2FsZTsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5hbHRlclNjYWxlID0gcGFyYW1zLT5hbHRlclNjYWxlOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9ub2lzZV9iYW5kcyA9IHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMDsKCiAgaWYgKChwYXJhbXMtPmZyZXFTY2FsZSAhPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5hbHRlclNjYWxlICE9IFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5zYnJfbm9pc2VfYmFuZHMgIT0gU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQpKQogIHsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzEgPSAxOwogIH0KCiAgLyogaGVhZGVyX2V4dHJhXzIgKi8KICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9iYW5kcyA9IHBhcmFtcy0+c2JyX2xpbWl0ZXJfYmFuZHM7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xpbWl0ZXJfZ2FpbnMgPSBwYXJhbXMtPnNicl9saW1pdGVyX2dhaW5zOwoKICBpZiAoKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgPiA0ODAwMCkgJiYKICAgICAgKGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdGFydF9mcmVxdWVuY3kgPj0gOSkpCiAgewogICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xpbWl0ZXJfZ2FpbnMgPSBTQlJfTElNSVRFUl9HQUlOU19JTkZJTklURTsKICB9CgogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9pbnRlcnBvbF9mcmVxID0gcGFyYW1zLT5zYnJfaW50ZXJwb2xfZnJlcTsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc21vb3RoaW5nX2xlbmd0aCA9IHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGg7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAwOwoKICBpZiAoKHBhcmFtcy0+c2JyX2xpbWl0ZXJfYmFuZHMgIT0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnMgIT0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX2ludGVycG9sX2ZyZXEgIT0gU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGggIT0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCkpCiAgewogICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8yID0gMTsKICB9CgogICAvKiBvdGhlciBzd2l0Y2hlcyAqLwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVdhdmVDb2RpbmcgICAgICAgICAgICAgPSBwYXJhbXMtPnVzZVdhdmVDb2Rpbmc7CiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlUGFyYW1ldHJpY0NvZGluZyAgICAgICA9IHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZzsKCiAgLyogaW5pdCBmcmVxIGJhbmQgdGFibGUgKi8KICBpZih1cGRhdGVGcmVxQmFuZFRhYmxlKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZG93blNhbXBsZUZhY3RvcgogICAgICAgICAgICAgICAgICAgICAgICAgKSkKICB7CiAgICByZXR1cm4oMSk7CiAgfQoKICAvKiBub3cgY3JlYXRlIGVudmVsb3BlIGV4dCBhbmQgUU1GIGZvciBlYWNoIGF2YWlsYWJsZSBjaGFubmVsICovCiAgZm9yICggY2ggPSAwOyBjaCA8IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsgY2grKyApIHsKCiAgICAgaWYgKCBpbml0RW52Q2hhbm5lbCgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcKICAgICAgICAgICAgICAgICAgICAgICAgLGNoCiAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICAgewogICAgICAgcmV0dXJuKDEpOwogICAgIH0KCgogIH0gLyogbkNoYW5uZWxzICovCgogIC8qIHJlc2V0IGFuZCBpbnRpYWxpemUgYW5hbHlzaXMgcW1mICovCiAgZm9yICggY2ggPSAwOyBjaCA8ICgoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMpOyBjaCsrICkKICB7CiAgICBpbnQgZXJyOwogICAgVUlOVCBxbWZGbGFncyA9IChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSA/IFFNRl9GTEFHX0NMREZCIDogMDsKICAgIGlmIChzdGF0ZXNJbml0RmxhZykKICAgICAgcW1mRmxhZ3MgJj0gflFNRl9GTEFHX0tFRVBfU1RBVEVTOwogICAgZWxzZQogICAgICBxbWZGbGFncyB8PSAgUU1GX0ZMQUdfS0VFUF9TVEFURVM7CgogICAgZXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayggaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9RQVMqKWhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLT5GaWx0ZXJTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1mRmxhZ3MgKTsKICAgIGlmICgwIT1lcnIpIHsKICAgICAgcmV0dXJuIGVycjsKICAgIH0KICB9CgogIC8qICAqLwogIGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXEgPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS54T3ZlckZyZXE7CiAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5bkJ3RW5hYmxlZCA9IChwYXJhbXMtPmR5bkJ3U3VwcG9ydGVkICYmIHBhcmFtcy0+ZHluQndFbmFibGVkKTsKICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jID0gRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcSggaFNickVsZW1lbnQsIGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXEpOwogIGZvciAoIGkgPSAwOyBpIDwgNTsgaSsrICkKICAgICAgaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5W2ldID0gaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYzsKICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyTnVtQ2hhbm5lbHMgID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXE7CgogIC8qIFVwZGF0ZSBCYW5kd2l0aCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcmUgZW5jb2RlciAqLwogICpjb3JlQmFuZFdpdGggPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxOwoKICByZXR1cm4oMCk7CiB9CgpJTlQgc2JyRW5jb2Rlcl9HZXRJbkJ1ZmZlclNpemUoaW50IG5vQ2hhbm5lbHMpCnsKICBJTlQgdGVtcDsKCiAgdGVtcCA9ICgyMDQ4KTsKICB0ZW1wICs9IDEwMjQgKyBNQVhfU0FNUExFX0RFTEFZOwogIHRlbXAgKj0gbm9DaGFubmVsczsKICB0ZW1wICo9IHNpemVvZihJTlRfUENNKTsKICByZXR1cm4gdGVtcDsKfQoKLyoKICogRW5jb2RlIER1bW15IFNCUiBwYXlsb2FkIGZyYW1lcyB0byBmaWxsIHRoZSBkZWxheSBsaW5lcy4KICovCnN0YXRpYwpJTlQgRkRLc2JyRW5jX0RlbGF5Q29tcGVuc2F0aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIGludCBuLCBlbDsKCiAgICBmb3IgKG49aEVudkVuYy0+bkJpdHN0ckRlbGF5OyBuPjA7IG4tLSkKICAgIHsKICAgICAgZm9yIChlbD0wOyBlbDxoRW52RW5jLT5ub0VsZW1lbnRzOyBlbCsrKQogICAgICB7CiAgICAgICAgaWYgKEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyBoRW52RW5jLT5kb3duc2FtcGxlZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMtPnNickVsZW1lbnRbZWxdLT5zYnJDb25maWdEYXRhLm5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHNickVuY29kZXJfVXBkYXRlQnVmZmVycyhoRW52RW5jLCB0aW1lQnVmZmVyKTsKICAgIH0KCSAgcmV0dXJuIDA7Cn0KClVJTlQgc2JyRW5jb2Rlcl9MaW1pdEJpdFJhdGUoVUlOVCBiaXRSYXRlLCBVSU5UIG51bUNoYW5uZWxzLCBVSU5UIGNvcmVTYW1wbGVSYXRlLCBBVURJT19PQkpFQ1RfVFlQRSBhb3QpCnsKICBVSU5UIG5ld0JpdFJhdGU7CiAgSU5UIGluZGV4OwoKICBGREtfQVNTRVJUKG51bUNoYW5uZWxzID4gMCAmJiBudW1DaGFubmVscyA8PSAyKTsKICBpZiAoYW90ID09IEFPVF9QUykgewogICAgaWYgKG51bUNoYW5uZWxzID09IDIpIHsKICAgICAgaW5kZXggPSBnZXRQc1R1bmluZ1RhYmxlSW5kZXgoYml0UmF0ZSwgJm5ld0JpdFJhdGUpOwogICAgICBpZiAoaW5kZXggPT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKICAgICAgICBiaXRSYXRlID0gbmV3Qml0UmF0ZTsKICAgICAgfQogICAgICAvKiBTZXQgbnVtQ2hhbm5lbHMgdG8gMSBiZWNhdXNlIGZvciBQUyB3ZSBuZWVkIGEgU0JSIFNDRSAobW9ubykgZWxlbWVudC4gKi8KICAgICAgbnVtQ2hhbm5lbHMgPSAxOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQogIGluZGV4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCBudW1DaGFubmVscywgY29yZVNhbXBsZVJhdGUsIGFvdCwgJm5ld0JpdFJhdGUpOwogIGlmIChpbmRleCAhPSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgbmV3Qml0UmF0ZSA9IGJpdFJhdGU7CiAgfQoKICByZXR1cm4gbmV3Qml0UmF0ZTsKfQoKVUlOVCBzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKEFVRElPX09CSkVDVF9UWVBFIGFvdCkKewogIFVJTlQgaXNQb3NzaWJsZT0oQU9UX1BTPT1hb3QpPzA6MTsKICByZXR1cm4gaXNQb3NzaWJsZTsKfQoKSU5UIHNickVuY29kZXJfSW5pdCgKICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKICAgICAgICBTQlJfRUxFTUVOVF9JTkZPICAgICBlbEluZm9bKDgpXSwKICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBub0VsZW1lbnRzLAogICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKmlucHV0QnVmZmVyLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmNvcmVCYW5kd2lkdGgsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqaW5wdXRCdWZmZXJPZmZzZXQsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqbnVtQ2hhbm5lbHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY29yZVNhbXBsZVJhdGUsCiAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpmcmFtZUxlbmd0aCwKICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSAgICBhb3QsCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAqZGVsYXksCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtRmFjdG9yLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKICAgICAgICBVTE9ORyAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICkKewogICAgSEFORExFX0VSUk9SX0lORk8gZXJyb3JJbmZvID0gbm9FcnJvcjsKICAgIHNickNvbmZpZ3VyYXRpb24gc2JyQ29uZmlnWyg4KV07CiAgICBJTlQgZXJyb3IgPSAwOwogICAgSU5UIGxvd2VzdEJhbmR3aWR0aDsKICAgIC8qIFNhdmUgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgSU5UIGlucHV0U2FtcGxlUmF0ZSA9ICpjb3JlU2FtcGxlUmF0ZTsKICAgIGludCBjb3JlRnJhbWVMZW5ndGggPSAqZnJhbWVMZW5ndGg7CiAgICBpbnQgaW5wdXRCYW5kV2lkdGggPSAqY29yZUJhbmR3aWR0aDsKICAgIGludCBpbnB1dENoYW5uZWxzID0gKm51bUNoYW5uZWxzOwoKICAgIGludCBkb3duc2FtcGxlZE9mZnNldCA9IDA7CiAgICBpbnQgc2JyT2Zmc2V0ID0gMDsKICAgIGludCBkb3duc2FtcGxlckRlbGF5ID0gMDsKICAgIGludCB0aW1lRG9tYWluRG93bnNhbXBsZSA9IDA7CiAgICBpbnQgbkJpdHN0ckRlbGF5ID0gMDsKICAgIGludCBoaWdoZXN0U2JyU3RhcnRGcmVxLCBoaWdoZXN0U2JyU3RvcEZyZXE7CiAgICBpbnQgbG93RGVsYXkgPSAwOwogICAgaW50IHVzZVBzID0gMDsKCiAgICAvKiBjaGVjayB3aGV0aGVyIFNCUiBzZXR0aW5nIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgZW5jb2RlciBjb25maWd1cmF0aW9uIChiaXRyYXRlLCBzYW1wbGVyYXRlKSAqLwogICAgaWYgKCFzYnJFbmNvZGVyX0lzU2luZ2xlUmF0ZVBvc3NpYmxlKGFvdCkpIHsKICAgICAgKmRvd25TYW1wbGVGYWN0b3IgPSAyOwogICAgfQoKCgogICAgaWYgKCAoYW90PT1BT1RfUFMpICkgewogICAgICAgIHVzZVBzID0gMTsKICAgIH0KICAgIGlmICggKGFvdD09QU9UX0VSX0FBQ19FTEQpICkgewogICAgICAgIGxvd0RlbGF5ID0gMTsKICAgIH0KICAgIGVsc2UgaWYgKCAoYW90PT1BT1RfRVJfQUFDX0xEKSApIHsKICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIC8qIFBhcmFtZXRyaWMgU3RlcmVvICovCiAgICBpZiAoIHVzZVBzICkgewogICAgICBpZiAoICpudW1DaGFubmVscyA9PSAyICYmIG5vRWxlbWVudHMgPT0gMSkgewogICAgICAgIC8qIE92ZXJyaWRlIEVsZW1lbnQgdHlwZSBpbiBjYXNlIG9mIFBhcmFtZXRyaWMgc3RlcmVvICovCiAgICAgICAgZWxJbmZvWzBdLmVsVHlwZSA9IElEX1NDRTsKICAgICAgICBlbEluZm9bMF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOwogICAgICAgIGVsSW5mb1swXS5uQ2hhbm5lbHNJbkVsID0gMTsKICAgICAgICAvKiBjb3JlIGVuY29kZXIgZ2V0cyBkb3dubWl4ZWQgbW9ubyBzaWduYWwgKi8KICAgICAgICAqbnVtQ2hhbm5lbHMgID0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgZ290byBiYWlsOwogICAgICB9CiAgICB9IC8qIHVzZVBzICovCgogICAgLyogc2V0IHRoZSBjb3JlJ3Mgc2FtcGxlIHJhdGUgKi8KICAgIHN3aXRjaCAoKmRvd25TYW1wbGVGYWN0b3IpIHsKICAgIGNhc2UgMToKICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlPj4xOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZT4+MTsKICAgICAgcmV0dXJuIDA7IC8qIHJldHVybiBlcnJvciAqLwogICAgfQoKICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIGNvcmVTYW1wbGVSYXRlKSAqLwogICAgewogICAgICBpbnQgZGVsYXlEaWZmID0gMDsKICAgICAgaW50IGVsLCBjb3JlRWw7CgogICAgICAvKiBDaGVjayBpZiBldmVyeSBlbGVtZW50IGNvbmZpZyBpcyBmZWFzaWJsZSAqLwogICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCiAgICAgIHsKICAgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlICE9IElEX1NDRSAmJiBlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfQ1BFKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgLyogY2hlY2sgaWYgZGVzaXJlZCBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSAqLwogICAgICAgIGlmICggIUZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCAoZWxJbmZvW2NvcmVFbF0uYml0UmF0ZSwgMCwgZWxJbmZvW2NvcmVFbF0ubkNoYW5uZWxzSW5FbCwgaW5wdXRTYW1wbGVSYXRlLCAqY29yZVNhbXBsZVJhdGUsIGFvdCkgKQogICAgICAgIHsKICAgICAgICAgICAgZXJyb3IgPSAxOwogICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBEZXRlcm1pbmUgRGVsYXkgYmFsYW5jaW5nIGFuZCBuZXcgZW5jb2RlciBkZWxheSAqLwogICAgICBpZiAobG93RGVsYXkpIHsKICAgICAgICB7CiAgICAgICAgZGVsYXlEaWZmID0gKCpkZWxheSAqICpkb3duU2FtcGxlRmFjdG9yKSArIERFTEFZX0VMRDJTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICAqZGVsYXkgPSBERUxBWV9FTERTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZiAodXNlUHMpIHsKICAgICAgICBkZWxheURpZmYgPSAoKmRlbGF5ICogKmRvd25TYW1wbGVGYWN0b3IpICsgREVMQVlfQUFDMlBTKGNvcmVGcmFtZUxlbmd0aCwqZG93blNhbXBsZUZhY3Rvcik7CiAgICAgICAgKmRlbGF5ID0gREVMQVlfUFMoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBkZWxheURpZmYgPSBERUxBWV9BQUMyU0JSKGNvcmVGcmFtZUxlbmd0aCwqZG93blNhbXBsZUZhY3Rvcik7CiAgICAgICAgZGVsYXlEaWZmICs9ICgqZGVsYXkgKiAqZG93blNhbXBsZUZhY3Rvcik7CiAgICAgICAgKmRlbGF5ID0gREVMQVlfU0JSKGNvcmVGcmFtZUxlbmd0aCwqZG93blNhbXBsZUZhY3Rvcik7CiAgICAgIH0KCiAgICAgIGlmICghdXNlUHMpIHsKICAgICAgICAgIHRpbWVEb21haW5Eb3duc2FtcGxlID0gKmRvd25TYW1wbGVGYWN0b3ItMTsgIC8qIGFjdGl2YXRlIHRpbWUgZG9tYWluIGRvd25zYW1wbGVyIHdoZW4gZG93blNhbXBsZUZhY3RvciBpcyAhPSAxICovCiAgICAgIH0KCgogICAgICAvKiBUYWtlIGNhcmUgYWJvdXQgZG93bnNhbXBsZWQgZGF0YSBib3VuZCB0byB0aGUgU0JSIHBhdGggKi8KICAgICAgaWYgKCF0aW1lRG9tYWluRG93bnNhbXBsZSAmJiBkZWxheURpZmYgPiAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSBtdXN0IHR3ZWFrIHRoZSBiYWxhbmNpbmcgaW50byBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgZG93bnNhbXBsZWQgcGF0aAogICAgICAgICAqIGlzIHRoZSBvbmUgdG8gYmUgZGVsYXllZCwgYmVjYXVzZSBkZWxheWluZyB0aGUgUU1GIGRvbWFpbiBpbnB1dCwgYWxzbyBkZWxheXMKICAgICAgICAgKiB0aGUgZG93bnNhbXBsZWQgYXVkaW8sIGNvdW50ZXJhY3RpbmcgdG8gdGhlIHB1cnBvc2Ugb2YgZGVsYXkgYmFsYW5jaW5nLgogICAgICAgICAqLwogICAgICAgIHdoaWxlICggZGVsYXlEaWZmID4gMCApCiAgICAgICAgewogICAgICAgICAgLyogRW5jb2RlciBkZWxheSBpbmNyZWFzZXMgKi8KICAgICAgICAgIHsKICAgICAgICAgICAgKmRlbGF5ICs9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwogICAgICAgICAgICAvKiBBZGQgb25lIGZyYW1lIGRlbGF5IHRvIFNCUiBwYXRoICovCiAgICAgICAgICAgIGRlbGF5RGlmZiAtPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKICAgICAgICAgIH0KICAgICAgICAgIG5CaXRzdHJEZWxheSArPSAxOwogICAgICAgIH0KICAgICAgfSBlbHNlCiAgICAgIHsKICAgICAgICAqZGVsYXkgKz0gZml4cF9hYnMoZGVsYXlEaWZmKTsKICAgICAgfQoKICAgICAgaWYgKGRlbGF5RGlmZiA8IDApIHsKICAgICAgICAvKiBEZWxheSBBQUMgZGF0YSAqLwogICAgICAgIGRlbGF5RGlmZiA9IC1kZWxheURpZmY7CiAgICAgICAgLyogTXVsdGlwbHkgZG93bnNhbXBsZWQgb2Zmc2V0IGJ5IEFBQyBjb3JlIGNoYW5uZWxzLiBEaXZpZGUgYnkgMiBiZWNhdXNlIG9mIGhhbGYgc2FtcGxlcmF0ZSBvZiBkb3duc2FtcGxlZCBkYXRhLiAqLwogICAgICAgIEZES19BU1NFUlQoKmRvd25TYW1wbGVGYWN0b3I+MCAmJiAqZG93blNhbXBsZUZhY3Rvcjw9Mik7CiAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAoZGVsYXlEaWZmKigqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpOwogICAgICAgIHNick9mZnNldCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogRGVsYXkgU0JSIGlucHV0ICovCiAgICAgICAgaWYgKCBkZWxheURpZmYgPiAoaW50KWNvcmVGcmFtZUxlbmd0aCAqIChpbnQpKmRvd25TYW1wbGVGYWN0b3IgKQogICAgICAgIHsKICAgICAgICAgIC8qIERvIGJpdHN0cmVhbSBmcmFtZS13aXNlIGRlbGF5IGJhbGFuY2luZyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBTQlIgZnJhbWVsZW5ndGggc2FtcGxlcyBkZWxheSBkaWZmZXJlbmNlICovCiAgICAgICAgICBkZWxheURpZmYgLT0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CiAgICAgICAgICBuQml0c3RyRGVsYXkgPSAxOwogICAgICAgIH0KICAgICAgICAvKiBNdWx0aXBseSBpbnB1dCBvZmZzZXQgYnkgaW5wdXQgY2hhbm5lbHMgKi8KICAgICAgICBzYnJPZmZzZXQgPSBkZWxheURpZmYqKCpudW1DaGFubmVscyk7CiAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOwogICAgICB9CiAgICAgIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgICAgICAgICAgICA9IG5CaXRzdHJEZWxheTsKICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyAgICAgICAgICAgICAgID0gKm51bUNoYW5uZWxzOwogICAgICBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplICAgICAgICAgICAgICAgPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKICAgICAgaFNickVuY29kZXItPmZUaW1lRG9tYWluRG93bnNhbXBsaW5nID0gdGltZURvbWFpbkRvd25zYW1wbGU7CiAgICAgIGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yICAgICAgICA9ICpkb3duU2FtcGxlRmFjdG9yOwogICAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlICAgICAgICAgPSAwOwogICAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgICAgICAgICAgPSAwOwoKCiAgICAgIC8qIE9wZW4gU0JSIGVsZW1lbnRzICovCiAgICAgIGVsID0gLTE7CiAgICAgIGhpZ2hlc3RTYnJTdGFydEZyZXEgPSBoaWdoZXN0U2JyU3RvcEZyZXEgPSAwOwogICAgICBsb3dlc3RCYW5kd2lkdGggPSA5OTk5OTsKCiAgICAgIC8qIExvb3AgdGhyb3VnaCBlYWNoIGNvcmUgZW5jb2RlciBlbGVtZW50IGFuZCBnZXQgYSBtYXRjaGluZyBTQlIgZWxlbWVudCBjb25maWcgKi8KICAgICAgZm9yIChjb3JlRWw9MDsgY29yZUVsPG5vRWxlbWVudHM7IGNvcmVFbCsrKQogICAgICB7CiAgICAgICAgLyogU0JSIG9ubHkgaGFuZGxlcyBTQ0UgYW5kIENQRSdzICovCiAgICAgICAgaWYgKGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9TQ0UgfHwgZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX0NQRSkgewogICAgICAgICAgZWwrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvKiBTZXQgcGFyYW1ldHJpYyBTdGVyZW8gRmxhZy4gKi8KICAgICAgICBpZiAodXNlUHMpIHsKICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLmZQYXJhbWV0cmljU3RlcmVvID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAwOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBJbml0IHNickNvbmZpZyBzdHJ1Y3R1cmUKICAgICAgICAgKi8KICAgICAgICBpZiAoICEgRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cyAoICZzYnJDb25maWdbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUZyYW1lTGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICAgICAgewogICAgICAgICAgZXJyb3IgPSAxOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBNb2RpZnkgc2JyQ29uZmlnIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gRWxlbWVudCBwYXJhbWV0ZXJzCiAgICAgICAgICovCiAgICAgICAgaWYgKCAhIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoJnNickNvbmZpZ1tlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLmJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mb1tjb3JlRWxdLm5DaGFubmVsc0luRWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvcmVTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvKiB1c2VTcGVlY2hDb25maWcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIGxjc01vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHMsIC8qIGJQYXJhbWV0cmljU3RlcmVvICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdCkgKQogICAgICAgIHsKICAgICAgICAgIGVycm9yID0gMTsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CgogICAgICAgIC8qIEZpbmQgY29tbW9uIGZyZXF1ZW5jeSBib3JkZXIgZm9yIGFsbCBTQlIgZWxlbWVudHMgKi8KICAgICAgICBoaWdoZXN0U2JyU3RhcnRGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdGFydEZyZXEsIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxKTsKICAgICAgICBoaWdoZXN0U2JyU3RvcEZyZXEgPSBmaXhNYXgoaGlnaGVzdFNiclN0b3BGcmVxLCBzYnJDb25maWdbZWxdLnN0b3BGcmVxKTsKCiAgICAgIH0gLyogZmlyc3QgZWxlbWVudCBsb29wICovCgogICAgICAvKiBTZXQgZWxlbWVudCBjb3VudCAoY2FuIGJlIGxlc3MgdGhhbiBjb3JlIGVuY29kZXIgZWxlbWVudCBjb3VudCkgKi8KICAgICAgaFNickVuY29kZXItPm5vRWxlbWVudHMgPSBlbCsxOwoKICAgICAgRkRLc2JyRW5jX1JlYWxsb2NhdGUoaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9FbGVtZW50cyk7CgogICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKSB7CgogICAgICAgIGludCBiYW5kd2lkdGggPSAqY29yZUJhbmR3aWR0aDsKCiAgICAgICAgLyogVXNlIGxvd2VzdCBjb21tb24gYmFuZHdpZHRoICovCiAgICAgICAgc2JyQ29uZmlnW2VsXS5zdGFydEZyZXEgPSBoaWdoZXN0U2JyU3RhcnRGcmVxOwogICAgICAgIHNickNvbmZpZ1tlbF0uc3RvcEZyZXEgPSBoaWdoZXN0U2JyU3RvcEZyZXE7CgogICAgICAgIC8qIGluaXRpYWxpemUgU0JSIGVsZW1lbnQsIGFuZCBnZXQgY29yZSBiYW5kd2lkdGggKi8KICAgICAgICBlcnJvciA9IEZES3NickVuY19FbnZJbml0KGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJDb25maWdbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJpdHN0ckRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBlcmlvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgaWYgKGVycm9yICE9IDApIHsKICAgICAgICAgIGVycm9yID0gMjsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CgogICAgICAgIC8qIEdldCBsb3dlc3QgY29yZSBlbmNvZGVyIGJhbmR3aWR0aCB0byBiZSByZXR1cm5lZCBsYXRlci4gKi8KICAgICAgICBsb3dlc3RCYW5kd2lkdGggPSBmaXhNaW4obG93ZXN0QmFuZHdpZHRoLCBiYW5kd2lkdGgpOwoKICAgICAgfSAvKiBzZWNvbmQgZWxlbWVudCBsb29wICovCgogICAgICAvKiBJbml0aWFsaXplIGEgZG93bnNhbXBsZXIgZm9yIGVhY2ggY2hhbm5lbCBpbiBlYWNoIFNCUiBlbGVtZW50ICovCiAgICAgIGlmIChoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCiAgICAgIHsKICAgICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQogICAgICAgIHsKICAgICAgICAgIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWwgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CiAgICAgICAgICBJTlQgV2MsIGNoOwoKICAgICAgICAgIC8qIENhbGN1bGF0ZWQgcmVxdWlyZWQgbm9ybWFsaXplZCBjdXRvZmYgZnJlcXVlbmN5IChXYyA9IDEuMCAtPiBsb3dlc3RCYW5kd2lkdGggPSBpbnB1dFNhbXBsZVJhdGUvMikgKi8KICAgICAgICAgIFdjID0gKDIqbG93ZXN0QmFuZHdpZHRoKSoxMDAwIC8gaW5wdXRTYW1wbGVSYXRlOwoKICAgICAgICAgIGZvciAoY2g9MDsgY2g8aFNickVsLT5lbEluZm8ubkNoYW5uZWxzSW5FbDsgY2grKykKICAgICAgICAgIHsKICAgICAgICAgICAgRkRLYWFjRW5jX0luaXREb3duc2FtcGxlciAoJmhTYnJFbC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLCBXYywgKmRvd25TYW1wbGVGYWN0b3IpOwogICAgICAgICAgICBGREtfQVNTRVJUIChoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlci5kZWxheSA8PU1BWF9EU19GSUxURVJfREVMQVkpOwogICAgICAgICAgfQoKICAgICAgICAgIGRvd25zYW1wbGVyRGVsYXkgPSBoU2JyRWwtPnNickNoYW5uZWxbMF0tPmRvd25TYW1wbGVyLmRlbGF5OwogICAgICAgIH0gLyogdGhpcmQgZWxlbWVudCBsb29wICovCgogICAgICAgIC8qIGxmZSAqLwogICAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIgKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsIDAsICpkb3duU2FtcGxlRmFjdG9yKTsKCiAgICAgICAgLyogQWRkIHRoZSByZXNhbXBsZXIgYWRkaXRpb25hbCBkZWxheSB0byBnZXQgdGhlIGZpbmFsIGRlbGF5IGFuZCBidWZmZXIgb2Zmc2V0IHZhbHVlcy4gKi8KICAgICAgICBpZiAoc2JyT2Zmc2V0ID4gMCB8fCBkb3duc2FtcGxlZE9mZnNldCA8PSAoKGRvd25zYW1wbGVyRGVsYXkgKiAoKm51bUNoYW5uZWxzKSk+PigqZG93blNhbXBsZUZhY3Rvci0xKSkpIHsKICAgICAgICAgIHNick9mZnNldCArPSAoZG93bnNhbXBsZXJEZWxheSAtIGRvd25zYW1wbGVkT2Zmc2V0KSAqICgqbnVtQ2hhbm5lbHMpIDsKICAgICAgICAgICpkZWxheSArPSBkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQ7CiAgICAgICAgICBkb3duc2FtcGxlZE9mZnNldCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0IC09IChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSk7CiAgICAgICAgICBzYnJPZmZzZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5ID0gZG93bnNhbXBsZXJEZWxheTsKICAgICAgfQoKICAgICAgLyogQXNzaWduIGNvcmUgZW5jb2RlciBCYW5kd2lkdGggKi8KICAgICAgKmNvcmVCYW5kd2lkdGggPSBsb3dlc3RCYW5kd2lkdGg7CgogICAgICAvKiBFc3RpbWF0ZSBzYnIgYml0cmF0ZSwgMi41IGtCaXQvcyBwZXIgc2JyIGNoYW5uZWwgKi8KICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPSAyNTAwICogKCpudW1DaGFubmVscyk7CgogICAgICAvKiBpbml0aWFsaXplIHBhcmFtZXRyaWMgc3RlcmVvICovCiAgICAgIGlmICh1c2VQcykKICAgICAgewogICAgICAgIFBTRU5DX0NPTkZJRyBwc0VuY0NvbmZpZzsKICAgICAgICBGREtfQVNTRVJUKGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID09IDEpOwogICAgICAgIElOVCBwc1R1bmluZ1RhYmxlSWR4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGVsSW5mb1swXS5iaXRSYXRlLCBOVUxMKTsKCiAgICAgICAgcHNFbmNDb25maWcuZnJhbWVTaXplICAgICAgICAgICA9IGNvcmVGcmFtZUxlbmd0aDsgLy9zYnJDb25maWcuc2JyRnJhbWVTaXplOwogICAgICAgIHBzRW5jQ29uZmlnLnFtZkZpbHRlck1vZGUgICAgICAgPSAwOwogICAgICAgIHBzRW5jQ29uZmlnLnNiclBzRGVsYXkgICAgICAgICAgPSAwOwoKICAgICAgICAvKiB0dW5pbmcgcGFyYW1ldGVycyAqLwogICAgICAgIGlmIChwc1R1bmluZ1RhYmxlSWR4ICAhPSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgICAgICAgcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ublN0ZXJlb0JhbmRzOwogICAgICAgICAgcHNFbmNDb25maWcubWF4RW52ZWxvcGVzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ubkVudmVsb3BlczsKICAgICAgICAgIHBzRW5jQ29uZmlnLmlpZFF1YW50RXJyb3JUaHJlc2hvbGQgPSAoRklYUF9EQkwpcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5paWRRdWFudEVycm9yVGhyZXNob2xkOwoKICAgICAgICAgIC8qIGNhbGN1bGF0aW9uIGlzIG5vdCBxdWl0ZSBsaW5lYXIsIGluY3JlYXNlZCBudW1iZXIgb2YgZW52ZWxvcGVzIGNhdXNlcyBtb3JlIGJpdHMgKi8KICAgICAgICAgIC8qIGFzc3VtZSBhdmcuIDUwIGJpdHMgcGVyIGZyYW1lIGZvciAxMCBzdGVyZW8gYmFuZHMgLyAxIGVudmVsb3BlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gKCAoKCgqY29yZVNhbXBsZVJhdGUpICogNSAqIHBzRW5jQ29uZmlnLm5TdGVyZW9CYW5kcyAqIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcykgLyBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplKSk7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlcnJvciA9IEVSUk9SKENESSwgIkludmFsaWQgcHMgdHVuaW5nIHRhYmxlIGluZGV4LiIpOwogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KCiAgICAgICAgcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsoJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKiloU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzPj4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGVzSW5pdEZsYWcpID8gMCA6IFFNRl9GTEFHX0tFRVBfU1RBVEVTKTsKCiAgICAgICAgaWYoZXJyb3JJbmZvID09IG5vRXJyb3IpewogICAgICAgICAgLyogdXBkYXRlIGRlbGF5ICovCiAgICAgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ID0gRkRLc2JyRW5jX0dldEVudkVzdERlbGF5KCZoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwuc2JyRXh0cmFjdEVudmVsb3BlKTsKCiAgICAgICAgICBpZihub0Vycm9yICE9IChlcnJvckluZm8gPSBQU0VuY19Jbml0KCBoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc0VuY0NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpCiAgICAgICAgICB7CiAgICAgICAgICAgIGVycm9ySW5mbyA9IGhhbmRCYWNrKGVycm9ySW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBRTUYgYW5hbHlzaXMgKyBIeWJyaWQgYW5hbHlzaXMgKyBIeWJyaWQgc3ludGhlc2lzICsgUU1GIHN5bnRoZXNpcyArIGRvd25zYW1wbGVkIGlucHV0IGJ1ZmZlciBkZWxheSAqLwogICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9ICg2NCoxMC8yKSArICg2KjY0KSArICAoMCkgKyAoNjQqMTAvMi02NCsxKSArICgoKmRvd25TYW1wbGVGYWN0b3IpKmRvd25zYW1wbGVkT2Zmc2V0KTsKICAgICAgfQoKICAgICAgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID0gZG93bnNhbXBsZWRPZmZzZXQ7CiAgICAgIHsKICAgICAgICBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUgPSBjb3JlRnJhbWVMZW5ndGgqKCpudW1DaGFubmVscyk7CiAgICAgIH0KCiAgICAgIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgPSBzYnJPZmZzZXQ7CiAgICAgIC8qIERlbGF5IENvbXBlbnNhdGlvbjogZmlsbCBiaXRzdHJlYW0gZGVsYXkgYnVmZmVyIHdpdGggemVybyBpbnB1dCBzaWduYWwgKi8KICAgICAgaWYgKCBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCApCiAgICAgIHsKICAgICAgICBlcnJvciA9IEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbiAoaFNickVuY29kZXIsIGlucHV0QnVmZmVyKTsKICAgICAgICBpZiAoZXJyb3IgIT0gMCkKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgfQoKICAgICAgLyogU2V0IE91dHB1dCBmcmFtZSBsZW5ndGggKi8KICAgICAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CiAgICAgIC8qIElucHV0IGJ1ZmZlciBvZmZzZXQgKi8KICAgICAgKmlucHV0QnVmZmVyT2Zmc2V0ID0gZml4TWF4KHNick9mZnNldCwgZG93bnNhbXBsZWRPZmZzZXQpOwoKCiAgICB9CgogICAgcmV0dXJuIGVycm9yOwoKYmFpbDoKICAgIC8qIFJlc3RvcmUgaW5wdXQgc2V0dGluZ3MgKi8KICAgICpjb3JlU2FtcGxlUmF0ZSA9IGlucHV0U2FtcGxlUmF0ZTsKICAgICpmcmFtZUxlbmd0aCA9IGNvcmVGcmFtZUxlbmd0aDsKICAgICpudW1DaGFubmVscyA9IGlucHV0Q2hhbm5lbHM7CiAgICAqY29yZUJhbmR3aWR0aCA9IGlucHV0QmFuZFdpZHRoOwoKICAgIHJldHVybiBlcnJvcjsKIH0KCgpJTlQKc2JyRW5jb2Rlcl9FbmNvZGVGcmFtZSggIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHNickRhdGFCaXRzWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICBzYnJEYXRhWyg4KV1bTUFYX1BBWUxPQURfU0laRV0KICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgSU5UIGVycm9yOwogIGludCBlbDsKCiAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKICB7CiAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdICE9IE5VTEwpCiAgICB7CiAgICAgIGVycm9yID0gRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJEYXRhQml0c1tlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJEYXRhW2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgaWYgKGVycm9yKQogICAgICAgIHJldHVybiBlcnJvcjsKICAgIH0KICB9CgogIGlmICggKCBoU2JyRW5jb2Rlci0+bGZlQ2hJZHghPS0xKSAmJiAoaFNickVuY29kZXItPmRvd25TYW1wbGVGYWN0b3IgPiAxKSApCiAgeyAgIC8qIGxmZSBkb3duc2FtcGxlciAqLwogICAgICBJTlQgbk91dFNhbXBsZXM7CgogICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCArIGhTYnJFbmNvZGVyLT5sZmVDaElkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5PdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyk7CgoKICB9CgogIHJldHVybiAwOwp9CgoKSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgIGlmICggaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID4gMCApIHsKICAgICAgLyogTW92ZSBkZWxheWVkIGRvd25zYW1wbGVkIGRhdGEgKi8KICAgICAgRkRLbWVtY3B5ICggdGltZUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCkgKTsKICAgIH0gZWxzZSB7CiAgICAgIC8qIE1vdmUgZGVsYXllZCBpbnB1dCBkYXRhICovCiAgICAgIEZES21lbWNweSAoIHRpbWVCdWZmZXIsCiAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMgKiBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICk7CiAgICB9CiAgICBpZiAoIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwICApCiAgICB7CiAgICAgIGludCBlbDsKCiAgICAgIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspCiAgICAgIHsKICAgICAgICBGREttZW1tb3ZlICggaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzBdLAogICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVbMV0sCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVQ0hBUikgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSpNQVhfUEFZTE9BRF9TSVpFKSApOwoKICAgICAgICBGREttZW1tb3ZlKCAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSwKICAgICAgICAgICAgICAgICAgICAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUlOVCkgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSkgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiB9CgoKSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikKewogIElOVCBlc3RpbWF0ZUJpdHJhdGUgPSAwOwoKICBpZihoU2JyRW5jb2RlcikgewogICAgZXN0aW1hdGVCaXRyYXRlICs9IGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGU7CiAgfQoKICByZXR1cm4gZXN0aW1hdGVCaXRyYXRlOwp9CgpJTlQgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCnsKICBJTlQgZGVsYXkgPSAtMTsKCiAgaWYoaFNickVuY29kZXIpIHsKICAgIGRlbGF5ID0gaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5OwogIH0KICByZXR1cm4gZGVsYXk7Cn0KCgpJTlQgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCnsKICBpbnQgaTsKCiAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgcmV0dXJuIC0xOwogIH0KICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CiAgfQogIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgewogICAgcmV0dXJuIC0xOwogIH0KICBpbmZvICs9IGk7CgogIGluZm8tPm1vZHVsZV9pZCA9IEZES19TQlJFTkM7CiAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNCUkVOQ09ERVJfTElCX1ZMMCwgU0JSRU5DT0RFUl9MSUJfVkwxLCBTQlJFTkNPREVSX0xJQl9WTDIpOwogIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKI2lmZGVmIF9fQU5EUk9JRF9fCiAgaW5mby0+YnVpbGRfZGF0ZSA9ICIiOwogIGluZm8tPmJ1aWxkX3RpbWUgPSAiIjsKI2Vsc2UKICBpbmZvLT5idWlsZF9kYXRlID0gX19EQVRFX187CiAgaW5mby0+YnVpbGRfdGltZSA9IF9fVElNRV9fOwojZW5kaWYKICBpbmZvLT50aXRsZSA9ICJTQlIgRW5jb2RlciI7CgogIC8qIFNldCBmbGFncyAqLwogIGluZm8tPmZsYWdzID0gMAogICAgfCBDQVBGX1NCUl9IUQogICAgfCBDQVBGX1NCUl9QU19NUEVHCiAgICA7CiAgLyogRW5kIG9mIGZsYWdzICovCgogIHJldHVybiAwOwp9Cg==