Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCiAgIERlc2NyaXB0aW9uOgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImFhY2RlY29kZXJfbGliLmgiCgojaW5jbHVkZSAiYWFjX3JhbS5oIgojaW5jbHVkZSAiYWFjZGVjb2Rlci5oIgojaW5jbHVkZSAidHBkZWNfbGliLmgiCiNpbmNsdWRlICJGREtfY29yZS5oIiAvKiBGREtfdG9vbHMgdmVyc2lvbiBpbmZvICovCgoKICNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCgoKCgojaW5jbHVkZSAiY29uY2VhbC5oIgoKICNpbmNsdWRlICJhYWNkZWNfZHJjLmgiCgoKCi8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCiNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwwIDIKI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgNQojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1ZMMiAxNwojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1RJVExFICJBQUMgRGVjb2RlciBMaWIiCiNpZmRlZiBfX0FORFJPSURfXwojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX0RBVEUgIiIKI2RlZmluZSBBQUNERUNPREVSX0xJQl9CVUlMRF9USU1FICIiCiNlbHNlCiNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfREFURSBfX0RBVEVfXwojZGVmaW5lIEFBQ0RFQ09ERVJfTElCX0JVSUxEX1RJTUUgX19USU1FX18KI2VuZGlmCgpzdGF0aWMgQUFDX0RFQ09ERVJfRVJST1IKc2V0Q29uY2VhbE1ldGhvZCAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAogICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG1ldGhvZCApOwoKCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0dldEZyZWVCeXRlcyAoIGNvbnN0IEhBTkRMRV9BQUNERUNPREVSICBzZWxmLCBVSU5UICpwRnJlZUJ5dGVzKXsKCiAgLyogcmVzZXQgZnJlZSBieXRlcyAqLwogICpwRnJlZUJ5dGVzID0gMDsKCiAgLyogY2hlY2sgaGFuZGxlICovCiAgaWYoIXNlbGYpCiAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKCiAgLyogcmV0dXJuIG5yIG9mIGZyZWUgYnl0ZXMgKi8KICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CiAgKnBGcmVlQnl0ZXMgPSBGREtnZXRGcmVlQml0cyhoQnMpID4+IDM7CgogIC8qIHN1Y2Nlc3MgKi8KICByZXR1cm4gQUFDX0RFQ19PSzsKfQoKLyoqCiAqIENvbmZpZyBEZWNvZGVyIHVzaW5nIGEgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KICovCnN0YXRpYwpMSU5LU1BFQ19DUFAgQUFDX0RFQ09ERVJfRVJST1IgYWFjRGVjb2Rlcl9Db25maWcoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwgY29uc3QgQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjU3RydWN0KQp7CiAgQUFDX0RFQ09ERVJfRVJST1IgZXJyOwoKICAvKiBJbml0aWFsaXplIEFBQyBjb3JlIGRlY29kZXIsIGFuZCB1cGRhdGUgc2VsZi0+c3RyZWFtaW5mbyAqLwogIGVyciA9IENBYWNEZWNvZGVyX0luaXQoc2VsZiwgcEFzY1N0cnVjdCk7CgogIHJldHVybiBlcnI7Cn0KCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0NvbmZpZ1JhdyAoCiAgICAgICAgSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICBVQ0hBUiAqY29uZltdLAogICAgICAgIGNvbnN0IFVJTlQgbGVuZ3RoW10gKQp7CiAgQUFDX0RFQ09ERVJfRVJST1IgZXJyID0gQUFDX0RFQ19PSzsKICBUUkFOU1BPUlRERUNfRVJST1IgICBlcnJUcDsKICBVSU5UIGxheWVyLCBuck9mTGF5ZXJzID0gc2VsZi0+bnJPZkxheWVyczsKCiAgZm9yKGxheWVyID0gMDsgbGF5ZXIgPCBuck9mTGF5ZXJzOyBsYXllcisrKXsKICAgIGlmKGxlbmd0aFtsYXllcl0gPiAwKXsKICAgICAgZXJyVHAgPSB0cmFuc3BvcnREZWNfT3V0T2ZCYW5kQ29uZmlnKHNlbGYtPmhJbnB1dCwgY29uZltsYXllcl0sIGxlbmd0aFtsYXllcl0sIGxheWVyKTsKICAgICAgaWYgKGVyclRwICE9IFRSQU5TUE9SVERFQ19PSykgewogICAgICAgIHN3aXRjaCAoZXJyVHApIHsKICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19ORUVEX1RPX1JFU1RBUlQ6CiAgICAgICAgICBlcnIgPSBBQUNfREVDX05FRURfVE9fUkVTVEFSVDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDoKICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5TVVBQT1JURURfRk9STUFUOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGVyciA9IEFBQ19ERUNfVU5LTk9XTjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvKiBpZiBiYXNlbGF5ZXIgaXMgT0sgd2UgY29udGludWUgZGVjb2RpbmcgKi8KICAgICAgICBpZihsYXllciA+PSAxKXsKICAgICAgICAgIHNlbGYtPm5yT2ZMYXllcnMgPSBsYXllcjsKICAgICAgICAgIGVyciA9IEFBQ19ERUNfT0s7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gZXJyOwp9CgoKCnN0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Db25maWdDYWxsYmFjayh2b2lkICpoYW5kbGUsIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqcEFzY1N0cnVjdCkKewogIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgPSAoSEFORExFX0FBQ0RFQ09ERVIpaGFuZGxlOwogIEFBQ19ERUNPREVSX0VSUk9SIGVyciA9IEFBQ19ERUNfT0s7CiAgVFJBTlNQT1JUREVDX0VSUk9SIGVyclRwOwoKICB7CiAgICB7CiAgICAgIGVyciA9IGFhY0RlY29kZXJfQ29uZmlnKHNlbGYsIHBBc2NTdHJ1Y3QpOwogICAgfQogIH0KICBpZiAoZXJyID09IEFBQ19ERUNfT0spIHsKICAgIGlmICggc2VsZi0+ZmxhZ3MgJiAoQUNfVVNBQ3xBQ19SU1ZENTB8QUNfTER8QUNfRUxEKQogICAgICAmJiBDQ29uY2VhbG1lbnRfR2V0RGVsYXkoJnNlbGYtPmNvbmNlYWxDb21tb25EYXRhKSA+IDAgKQogICAgewogICAgICAvKiBSZXZlcnQgdG8gZXJyb3IgY29uY2VhbG1lbnQgbWV0aG9kIE5vaXNlIFN1YnN0aXR1dGlvbi4KICAgICAgICAgQmVjYXVzZSBpbnRlcnBvbGF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgVVNBQy9SU1ZENTAgb3IKICAgICAgICAgdGhlIGFkZGl0aW9uYWwgZGVsYXkgaXMgdW53YW50ZWQgZm9yIGxvdyBkZWxheSBjb2RlY3MuICovCiAgICAgIHNldENvbmNlYWxNZXRob2Qoc2VsZiwgMSk7CiNpZmRlZiBERUJVRwogICAgICBGREtwcmludGYoIiAgQ29uY2VhbG1lbnQgbWV0aG9kIHdhcyByZXZlcnRlZCB0byAxICFcbiIpOwojZW5kaWYKICAgIH0KICAgIGVyclRwID0gVFJBTlNQT1JUREVDX09LOwogIH0gZWxzZSB7CiAgICBpZiAoSVNfSU5JVF9FUlJPUihlcnIpKSB7CiAgICAgIGVyclRwID0gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgIH0gLyogRmF0YWwgZXJyb3JzICovCiAgICBlbHNlIGlmIChlcnIgPT0gQUFDX0RFQ19ORUVEX1RPX1JFU1RBUlQpIHsKICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOwogICAgfSBlbHNlIHsKICAgICAgZXJyVHAgPSBUUkFOU1BPUlRERUNfVU5LT1dOX0VSUk9SOwogICAgfQogIH0KCiAgcmV0dXJuIGVyclRwOwp9CgoKCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0FuY0RhdGFJbml0ICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSApCnsKICBDQW5jRGF0YSAqYW5jRGF0YSA9ICZzZWxmLT5hbmNEYXRhOwoKICByZXR1cm4gQ0FhY0RlY29kZXJfQW5jRGF0YUluaXQoYW5jRGF0YSwgYnVmZmVyLCBzaXplKTsKfQoKCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUgphYWNEZWNvZGVyX0FuY0RhdGFHZXQgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICpzaXplICkKewogIENBbmNEYXRhICphbmNEYXRhID0gJnNlbGYtPmFuY0RhdGE7CgogIHJldHVybiBDQWFjRGVjb2Rlcl9BbmNEYXRhR2V0KGFuY0RhdGEsIGluZGV4LCBwdHIsIHNpemUpOwp9CgoKc3RhdGljIEFBQ19ERUNPREVSX0VSUk9SCnNldENvbmNlYWxNZXRob2QgKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgICAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLwogICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG1ldGhvZCApCnsKICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CiAgQ0NvbmNlYWxQYXJhbXMgICpwQ29uY2VhbERhdGEgPSBOVUxMOwogIEhBTkRMRV9TQlJERUNPREVSIGhTYnJEZWMgPSBOVUxMOwogIEhBTkRMRV9BQUNfRFJDIGhEcmNJbmZvID0gTlVMTDsKICBIQU5ETEVfUENNX0RPV05NSVggaFBjbURteCA9IE5VTEw7CiAgQ0NvbmNlYWxtZW50TWV0aG9kIGJhY2t1cE1ldGhvZCA9IENvbmNlYWxNZXRob2ROb25lOwogIGludCBiYWNrdXBEZWxheSA9IDA7CiAgaW50IGJzRGVsYXkgPSAwOwoKICAvKiBjaGVjayBkZWNvZGVyIGhhbmRsZSAqLwogIGlmIChzZWxmICE9IE5VTEwpIHsKICAgIHBDb25jZWFsRGF0YSA9ICZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YTsKICAgIGhTYnJEZWMgPSBzZWxmLT5oU2JyRGVjb2RlcjsKICAgIGhEcmNJbmZvID0gc2VsZi0+aERyY0luZm87CiAgICBoUGNtRG14ID0gc2VsZi0+aFBjbVV0aWxzOwogIH0KCgogIC8qIEdldCBjdXJyZW50IG1ldGhvZC9kZWxheSAqLwogIGJhY2t1cE1ldGhvZCA9IENDb25jZWFsbWVudF9HZXRNZXRob2QocENvbmNlYWxEYXRhKTsKICBiYWNrdXBEZWxheSAgPSBDQ29uY2VhbG1lbnRfR2V0RGVsYXkocENvbmNlYWxEYXRhKTsKCiAgLyogQmUgc3VyZSB0byBzZXQgQUFDIGFuZCBTQlIgY29uY2VhbG1lbnQgbWV0aG9kIHNpbXVsdGFuZW91c2x5ISAqLwogIGVycm9yU3RhdHVzID0KICAgIENDb25jZWFsbWVudF9TZXRQYXJhbXMoCiAgICAgIHBDb25jZWFsRGF0YSwKICAgICAgKGludCltZXRob2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNlYWxNZXRob2QKICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxGYWRlT3V0U2xvcGUKICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwgIC8vIGNvbmNlYWxGYWRlSW5TbG9wZQogICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELCAgLy8gY29uY2VhbE11dGVSZWxlYXNlCiAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQgICAvLyBjb25jZWFsQ29tZk5vaXNlTGV2ZWwKICAgICk7CiAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKICAgICYmIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX0lOVkFMSURfSEFORExFKSApIHsKICAgIGdvdG8gYmFpbDsKICB9CgogIC8qIEdldCBuZXcgZGVsYXkgKi8KICBic0RlbGF5ID0gQ0NvbmNlYWxtZW50X0dldERlbGF5KHBDb25jZWFsRGF0YSk7CgogIHsKICAgIFNCUl9FUlJPUiBzYnJFcnIgPSBTQlJERUNfT0s7CgogICAgLyogc2V0IFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KICAgIHNickVyciA9IHNickRlY29kZXJfU2V0UGFyYW0gKAogICAgICBoU2JyRGVjLAogICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKICAgICAgYnNEZWxheQogICAgKTsKCiAgICBzd2l0Y2ggKHNickVycikgewogICAgY2FzZSBTQlJERUNfT0s6CiAgICBjYXNlIFNCUkRFQ19OT1RfSU5JVElBTElaRUQ6CiAgICAgIGlmIChzZWxmICE9IE5VTEwpIHsKICAgICAgICAvKiBzYXZlIHRoZSBwYXJhbSB2YWx1ZSBhbmQgc2V0IGxhdGVyCiAgICAgICAgICAgKHdoZW4gU0JSIGhhcyBiZWVuIGluaXRpYWxpemVkKSAqLwogICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5ID0gYnNEZWxheTsKICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgZXJyb3JTdGF0dXMgPQogICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCiAgICAgIGhEcmNJbmZvLAogICAgICBEUkNfQlNfREVMQVksCiAgICAgIGJzRGVsYXkKICAgICk7CiAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKICAgICYmIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX0lOVkFMSURfSEFORExFKSApIHsKICAgIGdvdG8gYmFpbDsKICB9CgogIGlmIChlcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKSB7CiAgICBQQ01ETVhfRVJST1IgZXJyID0KICAgICAgcGNtRG14X1NldFBhcmFtICgKICAgICAgICBoUGNtRG14LAogICAgICAgIERNWF9CU19EQVRBX0RFTEFZLAogICAgICAgIGJzRGVsYXkKICAgICAgKTsKICAgIHN3aXRjaCAoZXJyKSB7CiAgICBjYXNlIFBDTURNWF9JTlZBTElEX0hBTkRMRToKICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgY2FzZSBQQ01ETVhfT0s6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3JTdGF0dXMgPSBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICBnb3RvIGJhaWw7CiAgICB9CiAgfQoKCmJhaWw6CiAgaWYgKCAoZXJyb3JTdGF0dXMgIT0gQUFDX0RFQ19PSykKICAgICYmIChlcnJvclN0YXR1cyAhPSBBQUNfREVDX0lOVkFMSURfSEFORExFKSApCiAgewogICAgLyogUmV2ZXJ0IHRvIHRoZSBpbml0aWFsIHN0YXRlICovCiAgICBDQ29uY2VhbG1lbnRfU2V0UGFyYW1zICgKICAgICAgICBwQ29uY2VhbERhdGEsCiAgICAgICAgKGludCliYWNrdXBNZXRob2QsCiAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRCwKICAgICAgICBBQUNERUNfQ09OQ0VBTF9QQVJBTV9OT1RfU1BFQ0lGSUVELAogICAgICAgIEFBQ0RFQ19DT05DRUFMX1BBUkFNX05PVF9TUEVDSUZJRUQsCiAgICAgICAgQUFDREVDX0NPTkNFQUxfUEFSQU1fTk9UX1NQRUNJRklFRAogICAgICApOwogICAgLyogUmV2ZXJ0IFNCUiBiaXRzdHJlYW0gZGVsYXkgKi8KICAgIHNickRlY29kZXJfU2V0UGFyYW0gKAogICAgICAgIGhTYnJEZWMsCiAgICAgICAgU0JSX1NZU1RFTV9CSVRTVFJFQU1fREVMQVksCiAgICAgICAgYmFja3VwRGVsYXkKICAgICAgKTsKICAgIC8qIFJldmVydCBEUkMgYml0c3RyZWFtIGRlbGF5ICovCiAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKICAgICAgICBoRHJjSW5mbywKICAgICAgICBEUkNfQlNfREVMQVksCiAgICAgICAgYmFja3VwRGVsYXkKICAgICAgKTsKICAgIC8qIFJldmVydCBQQ00gbWl4ZG93biBiaXRzdHJlYW0gZGVsYXkgKi8KICAgIHBjbURteF9TZXRQYXJhbSAoCiAgICAgICAgaFBjbURteCwKICAgICAgICBETVhfQlNfREFUQV9ERUxBWSwKICAgICAgICBiYWNrdXBEZWxheQogICAgICApOwogIH0KCiAgcmV0dXJuIGVycm9yU3RhdHVzOwp9CgoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SCmFhY0RlY29kZXJfU2V0UGFyYW0gKCBjb25zdCBIQU5ETEVfQUFDREVDT0RFUiAgc2VsZiwgICAvKiE8IEhhbmRsZSBvZiB0aGUgZGVjb2RlciBpbnN0YW5jZSAqLwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFDREVDX1BBUkFNICAgICAgIHBhcmFtLCAgLyohPCBQYXJhbWV0ZXIgdG8gc2V0ICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICB2YWx1ZSkgIC8qITwgUGFyYW1ldGVyIHZhbHVlZCAgICAgICAgICAgICAgICovCnsKICBBQUNfREVDT0RFUl9FUlJPUiBlcnJvclN0YXR1cyA9IEFBQ19ERUNfT0s7CiAgQ0NvbmNlYWxQYXJhbXMgICpwQ29uY2VhbERhdGEgPSBOVUxMOwogIEhBTkRMRV9BQUNfRFJDIGhEcmNJbmZvID0gTlVMTDsKICBIQU5ETEVfUENNX0RPV05NSVggaFBjbURteCA9IE5VTEw7CiAgVERMaW1pdGVyUHRyIGhQY21UZGwgPSBOVUxMOwoKICAvKiBjaGVjayBkZWNvZGVyIGhhbmRsZSAqLwogIGlmIChzZWxmICE9IE5VTEwpIHsKICAgIHBDb25jZWFsRGF0YSA9ICZzZWxmLT5jb25jZWFsQ29tbW9uRGF0YTsKICAgIGhEcmNJbmZvID0gc2VsZi0+aERyY0luZm87CiAgICBoUGNtRG14ID0gc2VsZi0+aFBjbVV0aWxzOwogICAgaFBjbVRkbCA9IHNlbGYtPmhMaW1pdGVyOwogIH0gZWxzZSB7CiAgICBlcnJvclN0YXR1cyA9IEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgfQoKICAvKiBjb25maWd1cmUgdGhlIHN1YnN5c3RlbXMgKi8KICBzd2l0Y2ggKHBhcmFtKQogIHsKICBjYXNlIEFBQ19QQ01fT1VUUFVUX0lOVEVSTEVBVkVEOgogICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgfQogICAgc2VsZi0+b3V0cHV0SW50ZXJsZWF2ZWQgPSB2YWx1ZTsKICAgIGJyZWFrOwoKICBjYXNlIEFBQ19QQ01fTUlOX09VVFBVVF9DSEFOTkVMUzoKICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7CiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgewogICAgICBQQ01ETVhfRVJST1IgZXJyOwoKICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKICAgICAgICAgICAgICBoUGNtRG14LAogICAgICAgICAgICAgIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAogICAgICAgICAgICAgIHZhbHVlICk7CgogICAgICBzd2l0Y2ggKGVycikgewogICAgICBjYXNlIFBDTURNWF9PSzoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUzoKICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gKDgpKSB7CiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgewogICAgICBQQ01ETVhfRVJST1IgZXJyOwoKICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKICAgICAgICAgICAgICBoUGNtRG14LAogICAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTLAogICAgICAgICAgICAgIHZhbHVlICk7CgogICAgICBzd2l0Y2ggKGVycikgewogICAgICBjYXNlIFBDTURNWF9PSzoKICAgICAgICBicmVhazsKICAgICAgY2FzZSBQQ01ETVhfSU5WQUxJRF9IQU5ETEU6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICAgIH0KICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIEFBQ19QQ01fRFVBTF9DSEFOTkVMX09VVFBVVF9NT0RFOgogICAgewogICAgICBQQ01ETVhfRVJST1IgZXJyOwoKICAgICAgZXJyID0gcGNtRG14X1NldFBhcmFtICgKICAgICAgICAgICAgICBoUGNtRG14LAogICAgICAgICAgICAgIERNWF9EVUFMX0NIQU5ORUxfTU9ERSwKICAgICAgICAgICAgICB2YWx1ZSApOwoKICAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgY2FzZSBQQ01ETVhfT0s6CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgUENNRE1YX0lOVkFMSURfSEFORExFOgogICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgICB9CiAgICB9CiAgICBicmVhazsKCgogIGNhc2UgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRToKICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gMSkgewogICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICB9CiAgICBzZWxmLT5saW1pdGVyRW5hYmxlVXNlciA9IHZhbHVlOwogICAgYnJlYWs7CgogIGNhc2UgQUFDX1BDTV9MSU1JVEVSX0FUVEFDS19USU1FOgogICAgaWYgKHZhbHVlIDw9IDApIHsgIC8qIG1vZHVsZSBmdW5jdGlvbiBjb252ZXJ0cyB2YWx1ZSB0byB1bnNpZ25lZCAqLwogICAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgIH0KICAgIHN3aXRjaCAoc2V0TGltaXRlckF0dGFjayhoUGNtVGRsLCB2YWx1ZSkpIHsKICAgIGNhc2UgVERMSU1JVF9PSzoKICAgICAgYnJlYWs7CiAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9IQU5ETEU6CiAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgY2FzZSBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBBQUNfUENNX0xJTUlURVJfUkVMRUFTX1RJTUU6CiAgICBpZiAodmFsdWUgPD0gMCkgeyAgLyogbW9kdWxlIGZ1bmN0aW9uIGNvbnZlcnRzIHZhbHVlIHRvIHVuc2lnbmVkICovCiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgc3dpdGNoIChzZXRMaW1pdGVyUmVsZWFzZShoUGNtVGRsLCB2YWx1ZSkpIHsKICAgIGNhc2UgVERMSU1JVF9PSzoKICAgICAgYnJlYWs7CiAgICBjYXNlIFRETElNSVRfSU5WQUxJRF9IQU5ETEU6CiAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgY2FzZSBURExJTUlUX0lOVkFMSURfUEFSQU1FVEVSOgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIEFBQ19ERUNfU0VUX1BBUkFNX0ZBSUw7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBBQUNfUENNX09VVFBVVF9DSEFOTkVMX01BUFBJTkc6CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CiAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZyA9IGNoYW5uZWxNYXBwaW5nVGFibGVQYXNzdGhyb3VnaDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CiAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZyA9IGNoYW5uZWxNYXBwaW5nVGFibGVXQVY7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGVycm9yU3RhdHVzID0gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIGJyZWFrOwoKCiAgY2FzZSBBQUNfUU1GX0xPV1BPV0VSOgogICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiAxKSB7CiAgICAgIHJldHVybiBBQUNfREVDX1NFVF9QQVJBTV9GQUlMOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICByZXR1cm4gQUFDX0RFQ19JTlZBTElEX0hBTkRMRTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBRTUYgbW9kZSAobWlnaHQgYmUgb3ZlcnJpZGVuKQogICAgICogIDA6SFEgKGNvbXBsZXgpCiAgICAgKiAgMTpMUCAocGFydGlhbGx5IGNvbXBsZXgpCiAgICAgKi8KICAgIHNlbGYtPnFtZk1vZGVVc2VyID0gKFFNRl9NT0RFKXZhbHVlOwogICAgYnJlYWs7CgoKICBjYXNlIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SOgogICAgLyogRFJDIGNvbXByZXNzaW9uIGZhY3RvciAod2hlcmUgMCBpcyBubyBhbmQgMTI3IGlzIG1heCBjb21wcmVzc2lvbikgKi8KICAgIGVycm9yU3RhdHVzID0KICAgICAgYWFjRGVjb2Rlcl9kcmNTZXRQYXJhbSAoCiAgICAgICAgaERyY0luZm8sCiAgICAgICAgRFJDX0NVVF9TQ0FMRSwKICAgICAgICB2YWx1ZQogICAgICApOwogICAgYnJlYWs7CgogIGNhc2UgQUFDX0RSQ19CT09TVF9GQUNUT1I6CiAgICAvKiBEUkMgYm9vc3QgZmFjdG9yICh3aGVyZSAwIGlzIG5vIGFuZCAxMjcgaXMgbWF4IGJvb3N0KSAqLwogICAgZXJyb3JTdGF0dXMgPQogICAgICBhYWNEZWNvZGVyX2RyY1NldFBhcmFtICgKICAgICAgICBoRHJjSW5mbywKICAgICAgICBEUkNfQk9PU1RfU0NBTEUsCiAgICAgICAgdmFsdWUKICAgICAgKTsKICAgIGJyZWFrOwoKICBjYXNlIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMOgogICAgLyogRFJDIHJlZmVyZW5jZSBsZXZlbCBxdWFudGl6ZWQgaW4gMC4yNWRCIHN0ZXBzIHVzaW5nIHZhbHVlcyBbMC4uMTI3XSBpdCBpcyAnLScgZm9yIGFuYWxvZyBzY2FsaW5nICovCiAgICBlcnJvclN0YXR1cyA9CiAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAogICAgICAgIGhEcmNJbmZvLAogICAgICAgIFRBUkdFVF9SRUZfTEVWRUwsCiAgICAgICAgdmFsdWUKICAgICAgKTsKICAgIGJyZWFrOwoKICBjYXNlIEFBQ19EUkNfSEVBVllfQ09NUFJFU1NJT046CiAgICAvKiBEb24ndCBuZWVkIHRvIG92ZXJ3cml0ZSBjdXQvYm9vc3QgdmFsdWVzICovCiAgICBlcnJvclN0YXR1cyA9CiAgICAgIGFhY0RlY29kZXJfZHJjU2V0UGFyYW0gKAogICAgICAgIGhEcmNJbmZvLAogICAgICAgIEFQUExZX0hFQVZZX0NPTVBSRVNTSU9OLAogICAgICAgIHZhbHVlCiAgICAgICk7CiAgICBicmVhazsKCgogIGNhc2UgQUFDX1RQREVDX0NMRUFSX0JVRkZFUjoKICAgIHRyYW5zcG9ydERlY19TZXRQYXJhbShzZWxmLT5oSW5wdXQsIFRQREVDX1BBUkFNX1JFU0VULCAxKTsKICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQmFkQnl0ZXMgPSAwOwogICAgc2VsZi0+c3RyZWFtSW5mby5udW1Ub3RhbEJ5dGVzID0gMDsKICAgIC8qIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOyAqLwogICAgYnJlYWs7CgogIGNhc2UgQUFDX0NPTkNFQUxfTUVUSE9EOgogICAgLyogQ2hhbmdpbmcgdGhlIGNvbmNlYWxtZW50IG1ldGhvZCBjYW4gaW50cm9kdWNlIGFkZGl0aW9uYWwgYml0c3RyZWFtIGRlbGF5LiBBbmQKICAgICAgIHRoYXQgaW4gdHVybiBhZmZlY3RzIHN1YiBsaWJyYXJpZXMgYW5kIG1vZHVsZXMgd2hpY2ggbWFrZXMgdGhlIHdob2xlIHRoaW5nIHF1aXRlCiAgICAgICBjb21wbGV4LiAgU28gdGhlIGNvbXBsZXRlIGNoYW5naW5nIHJvdXRpbmUgaXMgcGFja2VkIGludG8gYSBoZWxwZXIgZnVuY3Rpb24gd2hpY2gKICAgICAgIGtlZXBzIGFsbCBtb2R1bGVzIGFuZCBsaWJzIGluIGEgY29uc2lzdGVudCBzdGF0ZSBldmVuIGluIHRoZSBjYXNlIGFuIGVycm9yIG9jY3VyZXMuICovCiAgICBlcnJvclN0YXR1cyA9IHNldENvbmNlYWxNZXRob2QgKCBzZWxmLCB2YWx1ZSApOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICByZXR1cm4gQUFDX0RFQ19TRVRfUEFSQU1fRkFJTDsKICB9ICAvKiBzd2l0Y2gocGFyYW0pICovCgogIHJldHVybiAoZXJyb3JTdGF0dXMpOwp9CgoKTElOS1NQRUNfQ1BQIEhBTkRMRV9BQUNERUNPREVSIGFhY0RlY29kZXJfT3BlbihUUkFOU1BPUlRfVFlQRSB0cmFuc3BvcnRGbXQsIFVJTlQgbnJPZkxheWVycykKewogIEFBQ19ERUNPREVSX0lOU1RBTkNFICphYWNEZWMgPSBOVUxMOwogIEhBTkRMRV9UUkFOU1BPUlRERUMgcEluOwogIGludCBlcnIgPSAwOwoKICAvKiBBbGxvY2F0ZSB0cmFuc3BvcnQgbGF5ZXIgc3RydWN0LiAqLwogIHBJbiA9IHRyYW5zcG9ydERlY19PcGVuKHRyYW5zcG9ydEZtdCwgVFBfRkxBR19NUEVHNCk7CiAgaWYgKHBJbiA9PSBOVUxMKSB7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIHRyYW5zcG9ydERlY19TZXRQYXJhbShwSW4sIFRQREVDX1BBUkFNX0lHTk9SRV9CVUZGRVJGVUxMTkVTUywgMSk7CgogIC8qIEFsbG9jYXRlIEFBQyBkZWNvZGVyIGNvcmUgc3RydWN0LiAqLwogIGFhY0RlYyA9IENBYWNEZWNvZGVyX09wZW4odHJhbnNwb3J0Rm10KTsKCiAgaWYgKGFhY0RlYyA9PSBOVUxMKSB7CiAgICB0cmFuc3BvcnREZWNfQ2xvc2UoJnBJbik7CiAgICBnb3RvIGJhaWw7CiAgfQogIGFhY0RlYy0+aElucHV0ID0gcEluOwoKICBhYWNEZWMtPm5yT2ZMYXllcnMgPSBuck9mTGF5ZXJzOwoKICBhYWNEZWMtPmNoYW5uZWxPdXRwdXRNYXBwaW5nID0gY2hhbm5lbE1hcHBpbmdUYWJsZVdBVjsKCiAgLyogUmVnaXN0ZXIgQ29uZmlnIFVwZGF0ZSBjYWxsYmFjay4gKi8KICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJBc2NDYWxsYmFjayhwSW4sIGFhY0RlY29kZXJfQ29uZmlnQ2FsbGJhY2ssICh2b2lkKilhYWNEZWMpOwoKICAvKiBvcGVuIFNCUiBkZWNvZGVyICovCiAgaWYgKCBTQlJERUNfT0sgIT0gc2JyRGVjb2Rlcl9PcGVuICggJmFhY0RlYy0+aFNickRlY29kZXIgKSkgewogICAgZXJyID0gLTE7CiAgICBnb3RvIGJhaWw7CiAgfQogIGFhY0RlYy0+cW1mTW9kZVVzZXIgPSBOT1RfREVGSU5FRDsKICB0cmFuc3BvcnREZWNfUmVnaXN0ZXJTYnJDYWxsYmFjayhhYWNEZWMtPmhJbnB1dCwgKGNiU2JyX3Qpc2JyRGVjb2Rlcl9IZWFkZXIsICh2b2lkKilhYWNEZWMtPmhTYnJEZWNvZGVyKTsKCgogIHBjbURteF9PcGVuKCAmYWFjRGVjLT5oUGNtVXRpbHMgKTsKICBpZiAoYWFjRGVjLT5oUGNtVXRpbHMgPT0gTlVMTCkgewogICAgZXJyID0gLTE7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBhYWNEZWMtPmhMaW1pdGVyID0gY3JlYXRlTGltaXRlcihURExfQVRUQUNLX0RFRkFVTFRfTVMsIFRETF9SRUxFQVNFX0RFRkFVTFRfTVMsIFNBTVBMRV9NQVgsICg4KSwgOTYwMDApOwogIGlmIChOVUxMID09IGFhY0RlYy0+aExpbWl0ZXIpIHsKICAgIGVyciA9IC0xOwogICAgZ290byBiYWlsOwogIH0KICBhYWNEZWMtPmxpbWl0ZXJFbmFibGVVc2VyID0gKFVDSEFSKS0xOwogIGFhY0RlYy0+bGltaXRlckVuYWJsZUN1cnIgPSAwOwoKCgogIC8qIEFzc3VyZSB0aGF0IGFsbCBtb2R1bGVzIGhhdmUgc2FtZSBkZWxheSAqLwogIGlmICggc2V0Q29uY2VhbE1ldGhvZChhYWNEZWMsIENDb25jZWFsbWVudF9HZXRNZXRob2QoJmFhY0RlYy0+Y29uY2VhbENvbW1vbkRhdGEpKSApIHsKICAgIGVyciA9IC0xOwogICAgZ290byBiYWlsOwogIH0KCmJhaWw6CiAgaWYgKGVyciA9PSAtMSkgewogICAgYWFjRGVjb2Rlcl9DbG9zZShhYWNEZWMpOwogICAgYWFjRGVjID0gTlVMTDsKICB9CiAgcmV0dXJuIGFhY0RlYzsKfQoKTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRmlsbCgKICAgICAgICBIQU5ETEVfQUFDREVDT0RFUiAgIHNlbGYsCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICpwQnVmZmVyW10sCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICBidWZmZXJTaXplW10sCiAgICAgICAgVUlOVCAgICAgICAgICAgICAgICpwQnl0ZXNWYWxpZAogICAgICAgICkKewogIFRSQU5TUE9SVERFQ19FUlJPUiB0cEVycjsKICAvKiBsb29wIGNvdW50ZXIgZm9yIGxheWVyczsgaWYgbm90IFRUX01QNF9SQVdQQUNLRVRTIHVzZWQgYXMgaW5kZXggZm9yIG9ubHkgCiAgICAgYXZhaWxhYmxlIGxheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIElOVCBsYXllciAgICAgID0gMDsKICBJTlQgbnJPZkxheWVycyA9IHNlbGYtPm5yT2ZMYXllcnM7CgogIHsKICAgIGZvciAobGF5ZXIgPSAwOyBsYXllciA8IG5yT2ZMYXllcnM7IGxheWVyKyspewogICAgICB7CiAgICAgICAgdHBFcnIgPSB0cmFuc3BvcnREZWNfRmlsbERhdGEoIHNlbGYtPmhJbnB1dCwgcEJ1ZmZlcltsYXllcl0sIGJ1ZmZlclNpemVbbGF5ZXJdLCAmcEJ5dGVzVmFsaWRbbGF5ZXJdLCBsYXllciApOwogICAgICAgIGlmICh0cEVyciAhPSBUUkFOU1BPUlRERUNfT0spIHsKICAgICAgICAgIHJldHVybiBBQUNfREVDX1VOS05PV047ICAvKiBNdXN0IGJlIGFuIGludGVybmFsIGVycm9yICovCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gQUFDX0RFQ19PSzsKfQoKCnN0YXRpYyB2b2lkIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKEhBTkRMRV9BQUNERUNPREVSIHNlbGYpCnsKICBDQWFjRGVjb2Rlcl9TaWduYWxJbnRlcnJ1cHRpb24oc2VsZik7CgogIGlmICggc2VsZi0+aFNickRlY29kZXIgIT0gTlVMTCApIHsKICAgIHNickRlY29kZXJfU2V0UGFyYW0oc2VsZi0+aFNickRlY29kZXIsIFNCUl9CU19JTlRFUlJVUFRJT04sIDApOwogIH0KfQoKc3RhdGljIHZvaWQgYWFjRGVjb2Rlcl9VcGRhdGVCaXRTdHJlYW1Db3VudGVycyhDU3RyZWFtSW5mbyAqcFNpLCBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsIGludCBuQml0cywgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXMpCnsKICAvKiBjYWxjdWxhdGUgYml0IGRpZmZlcmVuY2UgKGFtb3VudCBvZiBiaXRzIG1vdmVkIGZvcndhcmQpICovCiAgbkJpdHMgPSBuQml0cyAtIEZES2dldFZhbGlkQml0cyhoQnMpOwoKICAvKiBOb3RlOiBUaGUgYW1vdW50IG9mIGJpdHMgY29uc3VtZWQgbWlnaHQgYmVjb21lIG5lZ2F0aXZlIHdoZW4gcGFyc2luZyBhCiAgICAgYml0IHN0cmVhbSB3aXRoIHNldmVyYWwgc3ViIGZyYW1lcywgYW5kIHdlIGZpbmQgb3V0IGF0IHRoZSBsYXN0IHN1YiBmcmFtZQogICAgIHRoYXQgdGhlIHRvdGFsIGZyYW1lIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCB0aGUgc3VtIG9mIHN1YiBmcmFtZSBsZW5ndGguIAogICAgIElmIHRoaXMgaGFwcGVucywgdGhlIHRyYW5zcG9ydCBkZWNvZGVyIG1pZ2h0IHdhbnQgdG8gcmV3aW5kIHRvIHRoZSBzdXBwb3NlZAogICAgIGVuZGluZyBvZiB0aGUgdHJhbnNwb3J0IGZyYW1lLCBhbmQgdGhpcyBwb3NpdGlvbiBtaWdodCBiZSBiZWZvcmUgdGhlIGxhc3QKICAgICBhY2Nlc3MgdW5pdCBiZWdpbm5pbmcuICovCgogIC8qIENhbGMgYml0cmF0ZS4gKi8KICBpZiAocFNpLT5mcmFtZVNpemUgPiAwKSB7CiAgICBwU2ktPmJpdFJhdGUgPSAobkJpdHMgKiBwU2ktPnNhbXBsZVJhdGUpL3BTaS0+ZnJhbWVTaXplOwogIH0KCiAgLyogYml0L2J5dGUgY291bnRlcnMgKi8KICB7CiAgICBpbnQgbkJ5dGVzOwoKICAgIG5CeXRlcyA9IG5CaXRzPj4zOwogICAgcFNpLT5udW1Ub3RhbEJ5dGVzICs9IG5CeXRlczsKICAgIGlmIChJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpKSB7CiAgICAgIHBTaS0+bnVtVG90YWxBY2Nlc3NVbml0cysrOwogICAgfQogICAgaWYgKElTX0RFQ09ERV9FUlJPUihFcnJvclN0YXR1cykpIHsKICAgICAgcFNpLT5udW1CYWRCeXRlcyArPSBuQnl0ZXM7CiAgICAgIHBTaS0+bnVtQmFkQWNjZXNzVW5pdHMrKzsKICAgIH0KICB9Cn0KCnN0YXRpYyBJTlQgYWFjRGVjb2Rlcl9Fc3RpbWF0ZU51bWJlck9mTG9zdEZyYW1lcyhIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQp7CiAgSU5UIG47CgogIHRyYW5zcG9ydERlY19HZXRNaXNzaW5nQWNjZXNzVW5pdENvdW50KCAmbiwgc2VsZi0+aElucHV0KTsKCiAgcmV0dXJuIG47Cn0KCkxJTktTUEVDX0NQUCBBQUNfREVDT0RFUl9FUlJPUiBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKAogICAgICAgIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAogICAgICAgIElOVF9QQ00gICAgICAgICAgICpwVGltZURhdGFfZXh0ZXJuLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICB0aW1lRGF0YVNpemVfZXh0ZXJuLAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncykKewogICAgQUFDX0RFQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgICBJTlQgbGF5ZXI7CiAgICBJTlQgbkJpdHM7CiAgICBJTlQgaW50ZXJsZWF2ZWQgPSBzZWxmLT5vdXRwdXRJbnRlcmxlYXZlZDsKICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCczsKICAgIGludCBmVHBJbnRlcnJ1cHRpb24gPSAwOyAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KICAgIGludCBmVHBDb25jZWFsID0gMDsgICAgICAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgY29uY2VhbG1lbnQuICovCiAgICBJTlRfUENNICpwVGltZURhdGEgPSBOVUxMOwogICAgSU5UIHRpbWVEYXRhU2l6ZSA9IDA7CgoKICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgcmV0dXJuIEFBQ19ERUNfSU5WQUxJRF9IQU5ETEU7CiAgICB9CgogICAgcFRpbWVEYXRhID0gc2VsZi0+cGNtT3V0cHV0QnVmZmVyOwogICAgdGltZURhdGFTaXplID0gc2l6ZW9mKHNlbGYtPnBjbU91dHB1dEJ1ZmZlcikvc2l6ZW9mKCpzZWxmLT5wY21PdXRwdXRCdWZmZXIpOwoKICAgIGlmIChmbGFncyAmIEFBQ0RFQ19JTlRSKSB7CiAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtTG9zdEFjY2Vzc1VuaXRzID0gMDsKICAgIH0KCiAgICBoQnMgPSB0cmFuc3BvcnREZWNfR2V0Qml0c3RyZWFtKHNlbGYtPmhJbnB1dCwgMCk7CgogICAgLyogR2V0IGN1cnJlbnQgYml0cyBwb3NpdGlvbiBmb3IgYml0cmF0ZSBjYWxjdWxhdGlvbi4gKi8KICAgIG5CaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICBpZiAoISAoZmxhZ3MgJiAoQUFDREVDX0NPTkNFQUwgfCBBQUNERUNfRkxVU0gpICkgKQogICAgewogICAgICBUUkFOU1BPUlRERUNfRVJST1IgZXJyOwoKICAgICAgZm9yKGxheWVyID0gMDsgbGF5ZXIgPCBzZWxmLT5uck9mTGF5ZXJzOyBsYXllcisrKQogICAgICB7CiAgICAgICAgZXJyID0gdHJhbnNwb3J0RGVjX1JlYWRBY2Nlc3NVbml0KHNlbGYtPmhJbnB1dCwgbGF5ZXIpOwogICAgICAgIGlmIChlcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgICBzd2l0Y2ggKGVycikgewogICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTk9UX0VOT1VHSF9CSVRTOgogICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfTk9UX0VOT1VHSF9CSVRTOwogICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19TWU5DX0VSUk9SOgogICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IGFhY0RlY29kZXJfRXN0aW1hdGVOdW1iZXJPZkxvc3RGcmFtZXMoc2VsZik7CiAgICAgICAgICAgIGZUcEludGVycnVwdGlvbiA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBUUkFOU1BPUlRERUNfTkVFRF9UT19SRVNUQVJUOgogICAgICAgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfTkVFRF9UT19SRVNUQVJUOwogICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICBjYXNlIFRSQU5TUE9SVERFQ19DUkNfRVJST1I6CiAgICAgICAgICAgIGZUcENvbmNlYWwgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19VTktOT1dOOwogICAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAoc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPiAwKSB7CiAgICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMtLTsKICAgICAgfQogICAgfQoKICAgIC8qIFNpZ25hbCBiaXQgc3RyZWFtIGludGVycnVwdGlvbiB0byBvdGhlciBtb2R1bGVzIGlmIHJlcXVpcmVkLiAqLwogICAgaWYgKCBmVHBJbnRlcnJ1cHRpb24gfHwgKGZsYWdzICYgKEFBQ0RFQ19JTlRSfEFBQ0RFQ19DTFJISVNUKSkgKQogICAgewogICAgICBzYnJEZWNvZGVyX1NldFBhcmFtKHNlbGYtPmhTYnJEZWNvZGVyLCBTQlJfQ0xFQVJfSElTVE9SWSwgKGZsYWdzJkFBQ0RFQ19DTFJISVNUKSk7CiAgICAgIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOwogICAgICBpZiAoICEgKGZsYWdzICYgQUFDREVDX0lOVFIpICkgewogICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19UUkFOU1BPUlRfU1lOQ19FUlJPUjsKICAgICAgICBnb3RvIGJhaWw7CiAgICAgIH0KICAgIH0KCiAgICAvKiBFbXB0eSBiaXQgYnVmZmVyIGluIGNhc2Ugb2YgZmx1c2ggcmVxdWVzdC4gKi8KICAgIGlmIChmbGFncyAmIEFBQ0RFQ19GTFVTSCkKICAgIHsKICAgICAgdHJhbnNwb3J0RGVjX1NldFBhcmFtKHNlbGYtPmhJbnB1dCwgVFBERUNfUEFSQU1fUkVTRVQsIDEpOwogICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUxvc3RBY2Nlc3NVbml0cyA9IDA7CiAgICAgIHNlbGYtPnN0cmVhbUluZm8ubnVtQmFkQnl0ZXMgPSAwOwogICAgICBzZWxmLT5zdHJlYW1JbmZvLm51bVRvdGFsQnl0ZXMgPSAwOwogICAgfQogICAgLyogUmVzZXQgdGhlIG91dHB1dCBkZWxheSBmaWVsZC4gVGhlIG1vZHVsZXMgd2lsbCBhZGQgdGhlaXIgZmlndXJlcyBvbmUgYWZ0ZXIgYW5vdGhlci4gKi8KICAgIHNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXkgPSAwOwoKICAgIGlmIChzZWxmLT5saW1pdGVyRW5hYmxlVXNlcj09KFVDSEFSKS0xKSB7CiAgICAgIC8qIEVuYmFsZSBsaW1pdGVyIGZvciBhbGwgbm9uLWxvd2RlbGF5IEFPVCdzLiAqLwogICAgICBzZWxmLT5saW1pdGVyRW5hYmxlQ3VyciA9ICggc2VsZi0+ZmxhZ3MgJiAoQUNfTER8QUNfRUxEKSApID8gMCA6IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogVXNlIGxpbWl0ZXIgY29uZmlndXJhdGlvbiBhcyByZXF1ZXN0ZWQuICovCiAgICAgIHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyID0gc2VsZi0+bGltaXRlckVuYWJsZVVzZXI7CiAgICB9CiAgICAvKiByZXNldCBsaW1pdGVyIGdhaW4gb24gYSBwZXIgZnJhbWUgYmFzaXMgKi8KICAgIHNlbGYtPmV4dEdhaW5bMF0gPSBGTDJGWENPTlNUX0RCTCgxLjBmLyhmbG9hdCkoMTw8VERMX0dBSU5fU0NBTElORykpOwoKCiAgICBFcnJvclN0YXR1cyA9IENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHwgKGZUcENvbmNlYWwgPyBBQUNERUNfQ09OQ0VBTCA6IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVEYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQpOwoKICAgIGlmICghKGZsYWdzICYgKEFBQ0RFQ19DT05DRUFMfEFBQ0RFQ19GTFVTSCkpKSB7CiAgICAgIFRSQU5TUE9SVERFQ19FUlJPUiB0cEVycjsKICAgICAgdHBFcnIgPSB0cmFuc3BvcnREZWNfRW5kQWNjZXNzVW5pdChzZWxmLT5oSW5wdXQpOwogICAgICBpZiAodHBFcnIgIT0gVFJBTlNQT1JUREVDX09LKSB7CiAgICAgICAgc2VsZi0+ZnJhbWVPSyA9IDA7CiAgICAgIH0KICAgIH0KCiAgICAvKiBJZiB0aGUgY3VycmVudCBwVGltZURhdGEgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIHNpZ25hbCwgdGhlcmUgbm90aGluZyBlbHNlIHdlIGNhbiBkbywgc28gYmFpbC4gKi8KICAgIGlmICggISBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgewogICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgewogICAgICAvKiBFeHBvcnQgZGF0YSBpbnRvIHN0cmVhbWluZm8gc3RydWN0dXJlICovCiAgICAgIHNlbGYtPnN0cmVhbUluZm8uc2FtcGxlUmF0ZSA9IHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZTsKICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgID0gc2VsZi0+c3RyZWFtSW5mby5hYWNTYW1wbGVzUGVyRnJhbWU7CiAgICB9CiAgICBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzID0gc2VsZi0+c3RyZWFtSW5mby5hYWNOdW1DaGFubmVsczsKCgoKICAgIENBYWNEZWNvZGVyX1N5bmNRbWZNb2RlKHNlbGYpOwoKLyogc2JyIGRlY29kZXIgKi8KCiAgICBpZiAoRXJyb3JTdGF0dXMgfHwgKGZsYWdzICYgQUFDREVDX0NPTkNFQUwpIHx8IHNlbGYtPnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bMF0tPmNvbmNlYWxtZW50SW5mby5jb25jZWFsU3RhdGUgPiBDb25jZWFsU3RhdGVfRmFkZUluKQogICAgewogICAgICBzZWxmLT5mcmFtZU9LID0gMDsgIC8qIGlmIGFuIGVycm9yIGhhcyBvY2N1cmVkIGRvIGNvbmNlYWxtZW50IGluIHRoZSBTQlIgZGVjb2RlciB0b28gKi8KICAgIH0KCiAgICBpZiAoc2VsZi0+c2JyRW5hYmxlZCkKICAgIHsKICAgICAgU0JSX0VSUk9SIHNickVycm9yID0gU0JSREVDX09LOwogICAgICBpbnQgY2hJZHgsIG51bUNvcmVDaGFubmVsID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKICAgICAgaW50IGNoT3V0TWFwSWR4ID0gKChzZWxmLT5jaE1hcEluZGV4PT0wKSAmJiAobnVtQ29yZUNoYW5uZWw8NykpID8gbnVtQ29yZUNoYW5uZWwgOiBzZWxmLT5jaE1hcEluZGV4OwoKICAgICAgLyogc2V0IHBhcmFtcyAqLwogICAgICBzYnJEZWNvZGVyX1NldFBhcmFtICggc2VsZi0+aFNickRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQlJfU1lTVEVNX0JJVFNUUkVBTV9ERUxBWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnNiclBhcmFtcy5ic0RlbGF5KTsKICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIHNlbGYtPmhTYnJEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JSX0ZMVVNIX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBBQUNERUNfRkxVU0gpICk7CgogICAgICBpZiAoIHNlbGYtPnN0cmVhbUluZm8uYW90ID09IEFPVF9FUl9BQUNfRUxEICkgewogICAgICAgIC8qIENvbmZpZ3VyZSBRTUYgKi8KICAgICAgICBzYnJEZWNvZGVyX1NldFBhcmFtICggc2VsZi0+aFNickRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUl9MRF9RTUZfVElNRV9BTElHTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmZsYWdzICYgQUNfTERfTVBTKSA/IDEgOiAwICk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBQQ01ETVhfRVJST1IgZG14RXJyOwogICAgICAgIElOVCAgbWF4T3V0Q2ggPSAwOwoKICAgICAgICBkbXhFcnIgPSBwY21EbXhfR2V0UGFyYW0oc2VsZi0+aFBjbVV0aWxzLCBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUywgJm1heE91dENoKTsKICAgICAgICBpZiAoIChkbXhFcnIgPT0gUENNRE1YX09LKSAmJiAobWF4T3V0Q2ggPT0gMSkgKSB7CiAgICAgICAgICAvKiBEaXNhYmxlIFBTIHByb2Nlc3NpbmcgaWYgd2UgaGF2ZSB0byBjcmVhdGUgYSBtb25vIG91dHB1dCBzaWduYWwuICovCiAgICAgICAgICBzZWxmLT5wc1Bvc3NpYmxlID0gMDsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKiBhcHBseSBTQlIgcHJvY2Vzc2luZyAqLwogICAgICBzYnJFcnJvciA9IHNickRlY29kZXJfQXBwbHkgKCBzZWxmLT5oU2JyRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRpbWVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxPdXRwdXRNYXBwaW5nW2NoT3V0TWFwSWR4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZyYW1lT0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPnBzUG9zc2libGUpOwoKCiAgICAgaWYgKHNickVycm9yID09IFNCUkRFQ19PSykgewogICAgICAgI2RlZmluZSBVUFNfU0NBTEUgIDIgIC8qIE1heGltdW0gdXBzYW1wbGluZyBmYWN0b3IgaXMgNCAoQ0VMUCtTQlIpICovCiAgICAgICBGSVhQX0RCTCAgdXBzYW1wbGVGYWN0b3IgPSBGTDJGWENPTlNUX0RCTCgxLjBmLygxPDxVUFNfU0NBTEUpKTsKCiAgICAgICAvKiBVcGRhdGUgZGF0YSBpbiBzdHJlYW1pbmZvIHN0cnVjdHVyZS4gQXNzdW1lIHRoYXQgdGhlIFNCUiB1cHNhbXBsaW5nIGZhY3RvciBpcyBlaXRoZXIgMSBvciAyICovCiAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19TQlJfUFJFU0VOVDsKICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZVJhdGUgIT0gc2VsZi0+c3RyZWFtSW5mby5zYW1wbGVSYXRlKSB7CiAgICAgICAgIGlmIChzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSA9PSA3NjgpIHsKICAgICAgICAgICB1cHNhbXBsZUZhY3RvciA9IEZMMkZYQ09OU1RfREJMKDguMGYvKDM8PFVQU19TQ0FMRSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHVwc2FtcGxlRmFjdG9yID0gRkwyRlhDT05TVF9EQkwoMi4wZi8oMTw8VVBTX1NDQUxFKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIC8qIEFwcGx5IHVwc2FtcGxpbmcgZmFjdG9yIHRvIGJvdGggdGhlIGNvcmUgZnJhbWUgbGVuZ3RoIGFuZCB0aGUgY29yZSBkZWxheSAqLwogICAgICAgc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUgICAgPSAgICAgICAoSU5UKWZNdWx0KChGSVhQX0RCTClzZWxmLT5zdHJlYW1JbmZvLmFhY1NhbXBsZXNQZXJGcmFtZTw8VVBTX1NDQUxFLCB1cHNhbXBsZUZhY3Rvcik7CiAgICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICA9IChVSU5UKShJTlQpZk11bHQoKEZJWFBfREJMKXNlbGYtPnN0cmVhbUluZm8ub3V0cHV0RGVsYXk8PFVQU19TQ0FMRSwgdXBzYW1wbGVGYWN0b3IpOwogICAgICAgc2VsZi0+c3RyZWFtSW5mby5vdXRwdXREZWxheSArPSBzYnJEZWNvZGVyX0dldERlbGF5KCBzZWxmLT5oU2JyRGVjb2RlciApOwoKICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7CiAgICAgICAgIHNlbGYtPmZsYWdzIHw9IEFDX1BTX1BSRVNFTlQ7CiAgICAgICB9CiAgICAgICBmb3IgKGNoSWR4ID0gbnVtQ29yZUNoYW5uZWw7IGNoSWR4IDwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsgY2hJZHgrPTEpIHsKICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbY2hJZHhdID0gQUNUX0ZST05UOwogICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1tjaElkeF0gPSBjaElkeDsKICAgICAgIH0KICAgICB9CiAgIH0KCgogICAgewogICAgSU5UIHBjbUxpbWl0ZXJTY2FsZSA9IDA7CiAgICBQQ01ETVhfRVJST1IgZG14RXJyID0gUENNRE1YX09LOwogICAgaWYgKCBmbGFncyAmIChBQUNERUNfSU5UUiB8IEFBQ0RFQ19DTFJISVNUKSApIHsKICAgICAgLyogZGVsZXRlIGRhdGEgZnJvbSB0aGUgcGFzdCAoZS5nLiBtaXhkb3duIGNvZWZpY2llbnRzKSAqLwogICAgICBwY21EbXhfUmVzZXQoIHNlbGYtPmhQY21VdGlscywgUENNRE1YX1JFU0VUX0JTX0RBVEEgKTsKICAgIH0KICAgIC8qIGRvIFBDTSBwb3N0IHByb2Nlc3NpbmcgKi8KICAgIGRteEVyciA9IHBjbURteF9BcHBseUZyYW1lICgKICAgICAgICAgICAgc2VsZi0+aFBjbVV0aWxzLAogICAgICAgICAgICBwVGltZURhdGEsCiAgICAgICAgICAgIHNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplLAogICAgICAgICAgICZzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzLAogICAgICAgICAgICBpbnRlcmxlYXZlZCwKICAgICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGUsCiAgICAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZywKICAgICAgICAgICAgKHNlbGYtPmxpbWl0ZXJFbmFibGVDdXJyKSA/ICZwY21MaW1pdGVyU2NhbGUgOiBOVUxMCiAgICAgICk7CiAgICBpZiAoIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQogICAgICAmJiAoZG14RXJyID09IFBDTURNWF9JTlZBTElEX01PREUpICkgewogICAgICAvKiBBbm5vdW5jZSB0aGUgZnJhbWV3b3JrIHRoYXQgdGhlIGN1cnJlbnQgY29tYmluYXRpb24gb2YgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBkb3dubWl4CiAgICAgICAqIHNldHRpbmdzIGFyZSBub3Qga25vdyB0byBwcm9kdWNlIGEgcHJlZGljdGFibGUgYmVoYXZpb3IgYW5kIHRodXMgbWF5YmUgcHJvZHVjZSBzdHJhbmdlIG91dHB1dC4gKi8KICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX0RFQ09ERV9GUkFNRV9FUlJPUjsKICAgIH0KCiAgICBpZiAoIGZsYWdzICYgQUFDREVDX0NMUkhJU1QgKSB7CiAgICAgIC8qIERlbGV0ZSB0aGUgZGVsYXllZCBzaWduYWwuICovCiAgICAgIHJlc2V0TGltaXRlcihzZWxmLT5oTGltaXRlcik7CiAgICB9CiAgICBpZiAoc2VsZi0+bGltaXRlckVuYWJsZUN1cnIpCiAgICB7CiAgICAgIC8qIFNldCBhY3R1YWwgc2lnbmFsIHBhcmFtZXRlcnMgKi8KICAgICAgc2V0TGltaXRlck5DaGFubmVscyhzZWxmLT5oTGltaXRlciwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyk7CiAgICAgIHNldExpbWl0ZXJTYW1wbGVSYXRlKHNlbGYtPmhMaW1pdGVyLCBzZWxmLT5zdHJlYW1JbmZvLnNhbXBsZVJhdGUpOwoKICAgICAgYXBwbHlMaW1pdGVyKAogICAgICAgICAgICAgIHNlbGYtPmhMaW1pdGVyLAogICAgICAgICAgICAgIHBUaW1lRGF0YSwKICAgICAgICAgICAgICBzZWxmLT5leHRHYWluLAogICAgICAgICAgICAgJnBjbUxpbWl0ZXJTY2FsZSwKICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgIHNlbGYtPmV4dEdhaW5EZWxheSwKICAgICAgICAgICAgICBzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZQogICAgICAgICAgICAgICk7CgogICAgICAvKiBBbm5vdW5jZSB0aGUgYWRkaXRpb25hbCBsaW1pdGVyIG91dHB1dCBkZWxheSAqLwogICAgICBzZWxmLT5zdHJlYW1JbmZvLm91dHB1dERlbGF5ICs9IGdldExpbWl0ZXJEZWxheShzZWxmLT5oTGltaXRlcik7CiAgICB9CiAgICB9CgoKICAgIC8qIFNpZ25hbCBpbnRlcnJ1cHRpb24gdG8gdGFrZSBlZmZlY3QgaW4gbmV4dCBmcmFtZS4gKi8KICAgIGlmICggZmxhZ3MgJiBBQUNERUNfRkxVU0ggKSB7CiAgICAgIGFhY0RlY29kZXJfU2lnbmFsSW50ZXJydXB0aW9uKHNlbGYpOwogICAgfQoKICAgIC8qIFVwZGF0ZSBleHRlcm5hbGx5IHZpc2libGUgY29weSBvZiBmbGFncyAqLwogICAgc2VsZi0+c3RyZWFtSW5mby5mbGFncyA9IHNlbGYtPmZsYWdzOwoKYmFpbDoKCiAgICAvKiBVcGRhdGUgU3RhdGlzdGljcyAqLwogICAgYWFjRGVjb2Rlcl9VcGRhdGVCaXRTdHJlYW1Db3VudGVycygmc2VsZi0+c3RyZWFtSW5mbywgaEJzLCBuQml0cywgRXJyb3JTdGF0dXMpOwoKICAgIC8qIENoZWNrIHdoZXRoZXIgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCiAgICBpZiAodGltZURhdGFTaXplX2V4dGVybiA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHMqc2VsZi0+c3RyZWFtSW5mby5mcmFtZVNpemUpIHsKICAgICAgRXJyb3JTdGF0dXMgPSBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMOwogICAgfQoKICAgIC8qIFVwZGF0ZSBleHRlcm5hbCBvdXRwdXQgYnVmZmVyLiAqLwogICAgaWYgKCBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgewogICAgICBGREttZW1jcHkocFRpbWVEYXRhX2V4dGVybiwgcFRpbWVEYXRhLCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKnNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKnNpemVvZigqcFRpbWVEYXRhKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgRkRLbWVtY2xlYXIocFRpbWVEYXRhX2V4dGVybiwgdGltZURhdGFTaXplX2V4dGVybipzaXplb2YoKnBUaW1lRGF0YV9leHRlcm4pKTsKICAgIH0KCiAgICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCkxJTktTUEVDX0NQUCB2b2lkIGFhY0RlY29kZXJfQ2xvc2UgKCBIQU5ETEVfQUFDREVDT0RFUiBzZWxmICkKewogIGlmIChzZWxmID09IE5VTEwpCiAgICByZXR1cm47CgoKICBpZiAoc2VsZi0+aExpbWl0ZXIgIT0gTlVMTCkgewogICAgZGVzdHJveUxpbWl0ZXIoc2VsZi0+aExpbWl0ZXIpOwogIH0KCiAgaWYgKHNlbGYtPmhQY21VdGlscyAhPSBOVUxMKSB7CiAgICBwY21EbXhfQ2xvc2UoICZzZWxmLT5oUGNtVXRpbHMgKTsKICB9CgoKCiAgaWYgKHNlbGYtPmhTYnJEZWNvZGVyICE9IE5VTEwpIHsKICAgIHNickRlY29kZXJfQ2xvc2UoJnNlbGYtPmhTYnJEZWNvZGVyKTsKICB9CgogIGlmIChzZWxmLT5oSW5wdXQgIT0gTlVMTCkgewogICAgdHJhbnNwb3J0RGVjX0Nsb3NlKCZzZWxmLT5oSW5wdXQpOwogIH0KCiAgQ0FhY0RlY29kZXJfQ2xvc2Uoc2VsZik7Cn0KCgpMSU5LU1BFQ19DUFAgQ1N0cmVhbUluZm8qIGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyAoIEhBTkRMRV9BQUNERUNPREVSIHNlbGYgKQp7CiAgcmV0dXJuIENBYWNEZWNvZGVyX0dldFN0cmVhbUluZm8oc2VsZik7Cn0KCkxJTktTUEVDX0NQUCBJTlQgYWFjRGVjb2Rlcl9HZXRMaWJJbmZvICggTElCX0lORk8gKmluZm8gKQp7CiAgaW50IGk7CgogIGlmIChpbmZvID09IE5VTEwpIHsKICAgIHJldHVybiAtMTsKICB9CgogIHNickRlY29kZXJfR2V0TGliSW5mbyggaW5mbyApOwogIHRyYW5zcG9ydERlY19HZXRMaWJJbmZvKCBpbmZvICk7CiAgRkRLX3Rvb2xzR2V0TGliSW5mbyggaW5mbyApOwogIHBjbURteF9HZXRMaWJJbmZvKCBpbmZvICk7CgogIC8qIHNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewogICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKICB9CiAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CiAgICByZXR1cm4gLTE7CiAgfQogIGluZm8gKz0gaTsKCiAgaW5mby0+bW9kdWxlX2lkID0gRkRLX0FBQ0RFQzsKICAvKiBidWlsZCBvd24gbGlicmFyeSBpbmZvICovCiAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKEFBQ0RFQ09ERVJfTElCX1ZMMCwgQUFDREVDT0RFUl9MSUJfVkwxLCBBQUNERUNPREVSX0xJQl9WTDIpOwogIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKICBpbmZvLT5idWlsZF9kYXRlID0gQUFDREVDT0RFUl9MSUJfQlVJTERfREFURTsKICBpbmZvLT5idWlsZF90aW1lID0gQUFDREVDT0RFUl9MSUJfQlVJTERfVElNRTsKICBpbmZvLT50aXRsZSA9IEFBQ0RFQ09ERVJfTElCX1RJVExFOwoKICAvKiBTZXQgZmxhZ3MgKi8KICBpbmZvLT5mbGFncyA9IDAKICAgICAgfCBDQVBGX0FBQ19MQwogICAgICB8IENBUEZfRVJfQUFDX1NDQUwKICAgICAgfCBDQVBGX0FBQ19WQ0IxMQogICAgICB8IENBUEZfQUFDX0hDUgogICAgICB8IENBUEZfQUFDX1JWTEMKICAgICAgfCBDQVBGX0VSX0FBQ19MRAogICAgICB8IENBUEZfRVJfQUFDX0VMRAogICAgICB8IENBUEZfQUFDX0NPTkNFQUxNRU5UCiAgICAgIHwgQ0FQRl9BQUNfRFJDCgogICAgICB8IENBUEZfQUFDX01QRUc0CgogICAgICB8IENBUEZfQUFDX0RSTV9CU0ZPUk1BVAoKICAgICAgfCBDQVBGX0FBQ18xMDI0CiAgICAgIHwgQ0FQRl9BQUNfOTYwCgogICAgICB8IENBUEZfQUFDXzUxMgoKICAgICAgfCBDQVBGX0FBQ180ODAKCiAgICAgIDsKICAvKiBFbmQgb2YgZmxhZ3MgKi8KCiAgcmV0dXJuIDA7Cn0KCgoKCg==