Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNLiBXZXJuZXIsIFRvYmlhcyBDaGFsdXBrYQogICBEZXNjcmlwdGlvbjogQmxvY2sgc3dpdGNoaW5nCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqIEluY2x1ZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImJsb2NrX3N3aXRjaC5oIgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCgojZGVmaW5lIExPV09WX1dJTkRPVyBfTE9XT1ZfV0lORE9XCgovKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLwoKc3RhdGljIEZJWFBfREJMIEZES2FhY0VuY19HZXRXaW5kb3dFbmVyZ3koY29uc3QgRklYUF9EQkwgaW5bXSwgY29uc3QgSU5UIGJsU3dXbmRJZHgpOwoKc3RhdGljIHZvaWQgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koCiAgICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKlJFU1RSSUNUIGJsb2NrU3dpdGNoaW5nQ29udHJvbCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgd2luZG93TGVuLAogICAgICAgIGNvbnN0IElOVF9QQ00gICAgICAgICAgICpwVGltZVNpZ25hbAogICAgICAgICk7CgovKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HICAgICAgICAgU1RBUlQgICAgICAgIFNIT1JUICAgICAgICAgU1RPUCAgICAgICAgIExPV09WICAgICAgICAgICAgICAgICAgKi8Kc3RhdGljIGNvbnN0IElOVCBibG9ja1R5cGUyd2luZG93U2hhcGVbMl1bNV0gPSB7IHtTSU5FX1dJTkRPVywgS0JEX1dJTkRPVywgIFdST05HX1dJTkRPVywgU0lORV9XSU5ET1csIEtCRF9XSU5ET1d9LCAgICAgLyogTEQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtLQkRfV0lORE9XLCAgU0lORV9XSU5ET1csIFNJTkVfV0lORE9XLCAgS0JEX1dJTkRPVywgIFdST05HX1dJTkRPV30gfTsgLyogTEMgKi8KCi8qIElJUiBoaWdoIHBhc3MgY29lZmZzICovCgojaWZuZGVmIFNJTkVUQUJMRV8xNkJJVAoKc3RhdGljIGNvbnN0IEZJWFBfREJMIGhpUGFzc0NvZWZmW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXT0KewogIEZMMkZYQ09OU1RfREJMKC0wLjUwOTUpLEZMMkZYQ09OU1RfREJMKDAuNzU0OCkKfTsKCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBhY2NXaW5kb3dOcmdGYWMgPSBGTDJGWENPTlNUX0RCTCgwLjNmKTsgICAgICAgICAgICAgICAgICAgLyogZmFjdG9yIGZvciBhY2N1bXVsYXRpbmcgZmlsdGVyZWQgd2luZG93IGVuZXJnaWVzICovCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBvbmVNaW51c0FjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfREJMKDAuN2YpOwovKiBzdGF0aWMgY29uc3QgZmxvYXQgYXR0YWNrUmF0aW8gPSAxMC4wOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvd2VyIHJhdGlvIGxpbWl0IGZvciBhdHRhY2tzICovCnN0YXRpYyBjb25zdCBGSVhQX0RCTCBpbnZBdHRhY2tSYXRpbyA9IEZMMkZYQ09OU1RfREJMKDAuMWYpOyAgICAgICAgICAgICAgICAgICAgLyogaW52ZXJ0ZWQgbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8KCi8qIFRoZSBuZXh0IGNvbnN0YW50cyBhcmUgc2NhbGVkLCBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgZm9yIGNvbXBhcmlzb24gd2l0aCBzY2FsZWQgdmFsdWVzKi8KLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8Kc3RhdGljIGNvbnN0IEZJWFBfREJMIG1pbkF0dGFja05yZyA9IChGTDJGWENPTlNUX0RCTCgxZSs2ZipOT1JNX1BDTV9FTkVSR1kpPj5CTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKTsgLyogbWluaW11bSBlbmVyZ3kgZm9yIGF0dGFja3MgKi8KCiNlbHNlCgpzdGF0aWMgY29uc3QgRklYUF9TR0wgaGlQYXNzQ29lZmZbQkxPQ0tfU1dJVENISU5HX0lJUl9MRU5dPQp7CiAgRkwyRlhDT05TVF9TR0woLTAuNTA5NSksRkwyRlhDT05TVF9TR0woMC43NTQ4KQp9OwoKc3RhdGljIGNvbnN0IEZJWFBfREJMIGFjY1dpbmRvd05yZ0ZhYyA9IEZMMkZYQ09OU1RfREJMKDAuM2YpOyAgICAgICAgICAgICAgICAgICAvKiBmYWN0b3IgZm9yIGFjY3VtdWxhdGluZyBmaWx0ZXJlZCB3aW5kb3cgZW5lcmdpZXMgKi8Kc3RhdGljIGNvbnN0IEZJWFBfU0dMIG9uZU1pbnVzQWNjV2luZG93TnJnRmFjID0gRkwyRlhDT05TVF9TR0woMC43Zik7Ci8qIHN0YXRpYyBjb25zdCBmbG9hdCBhdHRhY2tSYXRpbyA9IDEwLjA7ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG93ZXIgcmF0aW8gbGltaXQgZm9yIGF0dGFja3MgKi8Kc3RhdGljIGNvbnN0IEZJWFBfU0dMIGludkF0dGFja1JhdGlvID0gRkwyRlhDT05TVF9TR0woMC4xZik7ICAgICAgICAgICAgICAgICAgICAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAqLwovKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwpzdGF0aWMgY29uc3QgRklYUF9EQkwgbWluQXR0YWNrTnJnID0gKEZMMkZYQ09OU1RfREJMKDFlKzZmKk5PUk1fUENNX0VORVJHWSk+PkJMT0NLX1NXSVRDSF9FTkVSR1lfU0hJRlQpOyAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAqLwoKI2VuZGlmCgovKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKiBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIEZES2FhY0VuY19Jbml0QmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwgSU5UIGlzTG93RGVsYXkpCnsKICBGREttZW1jbGVhciAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBzaXplb2YoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wpKTsKCiAgaWYgKGlzTG93RGVsYXkpCiAgewogICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzID0gNDsKICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcyAgICA9IDA7CiAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkICAgICAgPSAwOwogIH0KICBlbHNlCiAgewogICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uQmxvY2tTd2l0Y2hXaW5kb3dzID0gODsKICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcyAgICA9IDE7CiAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkICAgICAgPSAxOwogIH0KCiAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICAgICAgICAgPSBNQVhfTk9fT0ZfR1JPVVBTOwoKICAvKiBJbml0aWFsaXplIHN0YXJ0dmFsdWUgZm9yIGJsb2NrdHlwZSAqLwogIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlICAgID0gTE9OR19XSU5ET1c7CiAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTaGFwZSAgICAgICAgICAgPSBibG9ja1R5cGUyd2luZG93U2hhcGVbYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hbGxvd1Nob3J0RnJhbWVzXVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RXaW5kb3dTZXF1ZW5jZV07Cgp9CgpzdGF0aWMgY29uc3QgSU5UIHN1Z2dlc3RlZEdyb3VwaW5nVGFibGVbVFJBTlNfRkFDXVtNQVhfTk9fT0ZfR1JPVVBTXSA9CnsKICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMCAqLyB7MSwgIDMsICAzLCAgMX0sCiAgICAvKiBBdHRhY2sgaW4gV2luZG93IDEgKi8gezEsICAxLCAgMywgIDN9LAogICAgLyogQXR0YWNrIGluIFdpbmRvdyAyICovIHsyLCAgMSwgIDMsICAyfSwKICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgMyAqLyB7MywgIDEsICAzLCAgMX0sCiAgICAvKiBBdHRhY2sgaW4gV2luZG93IDQgKi8gezMsICAxLCAgMSwgIDN9LAogICAgLyogQXR0YWNrIGluIFdpbmRvdyA1ICovIHszLCAgMiwgIDEsICAyfSwKICAgIC8qIEF0dGFjayBpbiBXaW5kb3cgNiAqLyB7MywgIDMsICAxLCAgMX0sCiAgICAvKiBBdHRhY2sgaW4gV2luZG93IDcgKi8gezMsICAzLCAgMSwgIDF9Cn07CgovKiBjaGFuZ2UgYmxvY2sgdHlwZSBkZXBlbmRpbmcgb24gY3VycmVudCBibG9ja3R5cGUgYW5kIHdoZXRoZXIgdGhlcmUncyBhbiBhdHRhY2sgKi8KLyogYXNzdW1lIG5vIGxvb2stYWhlYWQgKi8Kc3RhdGljIGNvbnN0IElOVCBjaGdXbmRTcVsyXVtOX0JMT0NLVFlQRVNdID0KewogIC8qICAgICAgICAgICAgIExPTkcgV0lORE9XICAgU1RBUlRfV0lORE9XICBTSE9SVF9XSU5ET1cgIFNUT1BfV0lORE9XLCAgTE9XT1ZfV0lORE9XLCBXUk9OR19XSU5ET1cgKi8KICAvKm5vIGF0dGFjayovIHtMT05HX1dJTkRPVywgIFNUT1BfV0lORE9XLCAgV1JPTkdfV0lORE9XLCBMT05HX1dJTkRPVywgIFNUT1BfV0lORE9XICwgV1JPTkdfV0lORE9XIH0sCiAgLyphdHRhY2sgICAqLyB7U1RBUlRfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVywgU1RBUlRfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVyB9Cn07CgovKiBjaGFuZ2UgYmxvY2sgdHlwZSBkZXBlbmRpbmcgb24gY3VycmVudCBibG9ja3R5cGUgYW5kIHdoZXRoZXIgdGhlcmUncyBhbiBhdHRhY2sgKi8KLyogYXNzdW1lIGxvb2stYWhlYWQgKi8Kc3RhdGljIGNvbnN0IElOVCBjaGdXbmRTcUxrQWhkWzJdWzJdW05fQkxPQ0tUWVBFU10gPQp7CiAgLyphdHRhY2sgICAgICAgICBMT05HIFdJTkRPVyAgICBTVEFSVF9XSU5ET1cgICBTSE9SVF9XSU5ET1cgICBTVE9QX1dJTkRPVyAgIExPV09WX1dJTkRPVywgV1JPTkdfV0lORE9XICovICAvKiBsYXN0IGF0dGFjayAqLwogIC8qbm8gYXR0YWNrKi8geyB7TE9OR19XSU5ET1csICAgU0hPUlRfV0lORE9XLCAgU1RPUF9XSU5ET1csICAgTE9OR19XSU5ET1csICBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30sICAgLyogbm8gYXR0YWNrICAgKi8KICAvKmF0dGFjayAgICovICAge1NUQVJUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNIT1JUX1dJTkRPVywgIFNUQVJUX1dJTkRPVywgV1JPTkdfV0lORE9XLCBXUk9OR19XSU5ET1d9IH0sIC8qIG5vIGF0dGFjayAgICovCiAgLypubyBhdHRhY2sqLyB7IHtMT05HX1dJTkRPVywgICBTSE9SVF9XSU5ET1csICBTSE9SVF9XSU5ET1csICBMT05HX1dJTkRPVywgIFdST05HX1dJTkRPVywgV1JPTkdfV0lORE9XfSwgICAvKiBhdHRhY2sgICAgICAqLwogIC8qYXR0YWNrICAgKi8gICB7U1RBUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU0hPUlRfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBXUk9OR19XSU5ET1csIFdST05HX1dJTkRPV30gfSAgLyogYXR0YWNrICAgICAgKi8KfTsKCmludCBGREthYWNFbmNfQmxvY2tTd2l0Y2hpbmcoQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbCwgY29uc3QgSU5UIGdyYW51bGVMZW5ndGgsIGNvbnN0IGludCBpc0xGRSwgY29uc3QgSU5UX1BDTSAqcFRpbWVTaWduYWwpCnsKICAgIFVJTlQgaTsKICAgIEZJWFBfREJMIGVuTTEsIGVuTWF4OwoKICAgIFVJTlQgbkJsb2NrU3dpdGNoV2luZG93cyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsKCiAgICAvKiBmb3IgTEZFIDogb25seSBMT05HIHdpbmRvdyBhbGxvd2VkICovCiAgICBpZiAoaXNMRkUpIHsKCiAgICAgIC8qIGNhc2UgTEZFOiAqLwogICAgICAvKiBvbmx5IGxvbmcgYmxvY2tzLCBhbHdheXMgdXNlIHNpbmUgd2luZG93cyAoTVBFRzIgQUFDLCBNUEVHNCBBQUMpICovCiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93U2hhcGUgICAgPSBTSU5FX1dJTkRPVzsKICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ub09mR3JvdXBzICAgICA9IDE7CiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMF0gICAgPSAxOwoKICAgICAgcmV0dXJuKDApOwogICAgfTsKCiAgICAvKiBTYXZlIGN1cnJlbnQgYXR0YWNrIGluZGV4IGFzIGxhc3QgYXR0YWNrIGluZGV4ICovCiAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjazsKICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleDsKCiAgICAvKiBTYXZlIGN1cnJlbnQgd2luZG93IGVuZXJneSBhcyBsYXN0IHdpbmRvdyBlbmVyZ3kgKi8KICAgIEZES21lbWNweShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV0sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSkpOwogICAgRkRLbWVtY3B5KGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdLCBzaXplb2YoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdKSk7CgogICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lcykKICAgIHsKICAgICAgLyogQ2FsY3VsYXRlIHN1Z2dlc3RlZCBncm91cGluZyBpbmZvIGZvciB0aGUgbGFzdCBmcmFtZSAqLwoKICAgICAgLyogUmVzZXQgZ3JvdXBpbmcgaW5mbyAqLwogICAgICBGREttZW1jbGVhciAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwgc2l6ZW9mKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW4pKTsKCiAgICAgIC8qIFNldCBncm91cGluZyBpbmZvICovCiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IE1BWF9OT19PRl9HUk9VUFM7CgogICAgICBGREttZW1jcHkoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlbiwgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RBdHRhY2tJbmRleF0sIHNpemVvZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuKSk7CgogICAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gVFJVRSkKICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bWF4V2luZG93TnJnID0gRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXSwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0QXR0YWNrSW5kZXgpOwogICAgICBlbHNlCiAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm1heFdpbmRvd05yZyA9IEZMMkZYQ09OU1RfREJMKDAuMCk7CgogICAgfQoKCiAgICAvKiBDYWxjdWxhdGUgdW5maWx0ZXJlZCBhbmQgZmlsdGVyZWQgZW5lcmdpZXMgaW4gc3Vid2luZG93cyBhbmQgY29tYmluZSB0byBzZWdtZW50cyAqLwogICAgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koYmxvY2tTd2l0Y2hpbmdDb250cm9sLCBncmFudWxlTGVuZ3RoPj4obkJsb2NrU3dpdGNoV2luZG93cz09ND8gMjozICksIHBUaW1lU2lnbmFsKTsKCiAgICAvKiBub3cgY2FsY3VsYXRlIGlmIHRoZXJlIGlzIGFuIGF0dGFjayAqLwoKICAgIC8qIHJlc2V0IGF0dGFjayAqLwogICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsKCiAgICAvKiBsb29rIGZvciBhdHRhY2sgKi8KICAgIGVuTWF4ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CiAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzBdW25CbG9ja1N3aXRjaFdpbmRvd3MtMV07CgogICAgZm9yIChpPTA7IGk8bkJsb2NrU3dpdGNoV2luZG93czsgaSsrKSB7CiAgICAgICAgRklYUF9EQkwgdG1wID0gZk11bHREaXYyKG9uZU1pbnVzQWNjV2luZG93TnJnRmFjLCBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyk7CiAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPSBmTXVsdEFkZCh0bXAsIGFjY1dpbmRvd05yZ0ZhYywgZW5NMSkgOwoKICAgICAgICBpZiAoZk11bHQoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldLGludkF0dGFja1JhdGlvKSA+IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWNjV2luZG93TnJnICkgewogICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7CiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrSW5kZXggPSBpOwogICAgICAgIH0KICAgICAgICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW2ldOwogICAgICAgIGVuTWF4ID0gZml4TWF4KGVuTWF4LCBlbk0xKTsKICAgIH0KCgogICAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOwoKICAgIC8qIENoZWNrIGlmIGF0dGFjayBzcHJlYWRzIG92ZXIgZnJhbWUgYm9yZGVyICovCiAgICBpZigoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPT0gRkFMU0UpICYmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPT0gVFJVRSkpIHsKICAgICAgICAvKiBpZiBhdHRhY2sgaXMgaW4gbGFzdCB3aW5kb3cgcmVwZWF0IFNIT1JUX1dJTkRPVyAqLwogICAgICAgIGlmICggKChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bbkJsb2NrU3dpdGNoV2luZG93cy0xXT4+NCkgPiBmTXVsdCgoRklYUF9EQkwpKDEwPDwoREZSQUNUX0JJVFMtMS00KSksIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVsxXSkpCiAgICAgICAgICAgJiYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID09IChJTlQpbkJsb2NrU3dpdGNoV2luZG93cy0xKQogICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IDA7CiAgICAgICAgfQogICAgfQoKCiAgICBpZihibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFsbG93TG9va0FoZWFkKQogICAgewoKCiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KICAgICAgICBjaGdXbmRTcUxrQWhkW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFja11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLyogTG93IERlbGF5ICovCiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdFdpbmRvd1NlcXVlbmNlID0KICAgICAgICBjaGdXbmRTcVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOwogICAgfQoKCiAgICAvKiB1cGRhdGUgd2luZG93IHNoYXBlICovCiAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NoYXBlID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbC0+YWxsb3dTaG9ydEZyYW1lc11bYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5sYXN0V2luZG93U2VxdWVuY2VdOwoKICAgIHJldHVybigwKTsKfQoKCgpzdGF0aWMgRklYUF9EQkwgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneShjb25zdCBGSVhQX0RCTCBpbltdLCBjb25zdCBJTlQgYmxTd1duZElkeCkKewovKiBGb3IgY29oZXJlbmN5LCBjaGFuZ2UgRkRLYWFjRW5jX0dldFdpbmRvd0VuZXJneSgpIHRvIGNhbGNsdWF0ZSB0aGUgZW5lcmd5IGZvciBhIGJsb2NrIHN3aXRjaGluZyBhbmFseXNpcyB3aW5kb3dzLAogICBub3QgZm9yIGEgc2hvcnQgYmxvY2suIFRoZSBzYW1lIGlzIGRvbmUgRkRLYWFjRW5jX0NhbGNXaW5kb3dFbmVyZ3koKS4gVGhlIHJlc3VsdCBvZiBGREthYWNFbmNfR2V0V2luZG93RW5lcmd5KCkKICAgaXMgdXNlZCBmb3IgYSBjb21wYXJpc2lvbiBvZiB0aGUgbWF4IGVuZXJneSBvZiBsZWZ0L3JpZ2h0IGNoYW5uZWwuICovCgogIHJldHVybiBpbltibFN3V25kSWR4XTsKCn0KCnN0YXRpYyB2b2lkIEZES2FhY0VuY19DYWxjV2luZG93RW5lcmd5KEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpSRVNUUklDVCBibG9ja1N3aXRjaGluZ0NvbnRyb2wsIElOVCB3aW5kb3dMZW4sIGNvbnN0IElOVF9QQ00gKnBUaW1lU2lnbmFsKQp7CiAgICBJTlQgIGk7CiAgICBVSU5UIHc7CgogICAgRklYUF9TR0wgaGlQYXNzQ29lZmYwID0gaGlQYXNzQ29lZmZbMF07CiAgICBGSVhQX1NHTCBoaVBhc3NDb2VmZjEgPSBoaVBhc3NDb2VmZlsxXTsKCiAgICAvKiBzdW0gdXAgc2NhbGFycHJvZHVjdCBvZiB0aW1lc2lnbmFsIGFzIHdpbmRvd2VkIEVuZXJnaWVzICovCiAgICBmb3IgKHc9MDsgdyA8IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bkJsb2NrU3dpdGNoV2luZG93czsgdysrKSB7CgogICAgICAgIEZJWFBfREJMIHRlbXBfd2luZG93TnJnICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgIEZJWFBfREJMIHRlbXBfd2luZG93TnJnRiA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICAgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUwICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdOwogICAgICAgIEZJWFBfREJMIHRlbXBfaWlyU3RhdGUxICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdOwoKICAgICAgICAvKiB3aW5kb3dOcmcgPSBzdW0odGltZXNhbXBsZV4yKSAqLwogICAgICAgIGZvcihpPTA7aTx3aW5kb3dMZW47aSsrKQogICAgICAgIHsKCiAgICAgICAgICAgIEZJWFBfREJMIHRlbXBVbmZpbHRlcmVkLCB0ZW1wRmlsdHJlZCwgdDEsIHQyOwogICAgICAgICAgICAvKiB0ZW1wVW5maWx0ZXJlZCBpcyBzY2FsZWQgd2l0aCAxIHRvIHByZXZlbnQgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB0ZW1wRmlsdHJlZCAqLwojaWYgU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMKICAgICAgICAgICAgdGVtcFVuZmlsdGVyZWQgPSAoRklYUF9EQkwpICpwVGltZVNpZ25hbCsrID4+IDE7CiNlbHNlCiAgICAgICAgICAgIHRlbXBVbmZpbHRlcmVkID0gKEZJWFBfREJMKSAqcFRpbWVTaWduYWwrKyA8PCAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtMSk7CiNlbmRpZgogICAgICAgICAgICB0MSA9IGZNdWx0RGl2MihoaVBhc3NDb2VmZjEsIHRlbXBVbmZpbHRlcmVkLXRlbXBfaWlyU3RhdGUwKTsKICAgICAgICAgICAgdDIgPSBmTXVsdERpdjIoaGlQYXNzQ29lZmYwLCB0ZW1wX2lpclN0YXRlMSk7CiAgICAgICAgICAgIHRlbXBGaWx0cmVkID0gKHQxIC0gdDIpIDw8IDE7CgogICAgICAgICAgICB0ZW1wX2lpclN0YXRlMCA9IHRlbXBVbmZpbHRlcmVkOwogICAgICAgICAgICB0ZW1wX2lpclN0YXRlMSA9IHRlbXBGaWx0cmVkOwoKICAgICAgICAgICAgLyogc3VidHJhY3QgMiBmcm9tIG92ZXJhbGxzY2FsaW5nIChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUKQogICAgICAgICAgICAgKiBiZWNhdXNlIHRlbXBVbmZpbHRlcmVkIHdhcyBhbHJlYWR5IHNjYWxlZCB3aXRoIDEgKGlzIDIgYWZ0ZXIgc3F1YXJpbmcpCiAgICAgICAgICAgICAqIHN1YnRyYWN0IDEgZnJvbSBvdmVyYWxsc2NhbGluZyAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCkKICAgICAgICAgICAgICogYmVjYXVzZSBvZiBmTXVsdERpdjIgaXMgZG9pbmcgYSBzY2FsaW5nIGJ5IG9uZSAqLwogICAgICAgICAgICB0ZW1wX3dpbmRvd05yZyArPSBmUG93MkRpdjIodGVtcFVuZmlsdGVyZWQpID4+IChCTE9DS19TV0lUQ0hfRU5FUkdZX1NISUZUIC0gMSAtIDIpOwogICAgICAgICAgICB0ZW1wX3dpbmRvd05yZ0YgKz0gZlBvdzJEaXYyKHRlbXBGaWx0cmVkKSA+PiAoQkxPQ0tfU1dJVENIX0VORVJHWV9TSElGVCAtIDEgLSAyKTsKICAgICAgICB9CiAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV1bd10gID0gdGVtcF93aW5kb3dOcmc7CiAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddID0gdGVtcF93aW5kb3dOcmdGOwogICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzBdICAgICA9IHRlbXBfaWlyU3RhdGUwOwogICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aWlyU3RhdGVzWzFdICAgICA9IHRlbXBfaWlyU3RhdGUxOwogICAgfQp9CgoKc3RhdGljIGNvbnN0IFVDSEFSIHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlWzVdWzVdID0KewogIC8qICAgICAgICAgICAgICAgICAgTE9OR19XSU5ET1cgICBTVEFSVF9XSU5ET1cgIFNIT1JUX1dJTkRPVyAgU1RPUF9XSU5ET1cgICBMT1dPVl9XSU5ET1cqLwogIC8qIExPTkdfV0lORE9XICAqLyB7TE9OR19XSU5ET1csICBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAogIC8qIFNUQVJUX1dJTkRPVyAqLyB7U1RBUlRfV0lORE9XLCBTVEFSVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBMT1dPVl9XSU5ET1d9LAogIC8qIFNIT1JUX1dJTkRPVyAqLyB7U0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBXUk9OR19XSU5ET1d9LAogIC8qIFNUT1BfV0lORE9XICAqLyB7U1RPUF9XSU5ET1csICBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1csICBMT1dPVl9XSU5ET1d9LAogIC8qIExPV09WX1dJTkRPVyAqLyB7TE9XT1ZfV0lORE9XLCBMT1dPVl9XSU5ET1csIFdST05HX1dJTkRPVywgTE9XT1ZfV0lORE9XLCBMT1dPVl9XSU5ET1d9LAp9OwoKaW50IEZES2FhY0VuY19TeW5jQmxvY2tTd2l0Y2hpbmcgKAogICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdCwKICAgICAgQkxPQ0tfU1dJVENISU5HX0NPTlRST0wgKmJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LAogICAgICBjb25zdCBJTlQgbkNoYW5uZWxzLAogICAgICBjb25zdCBJTlQgY29tbW9uV2luZG93ICkKewogIFVDSEFSIHBhdGNoVHlwZSA9IExPTkdfV0lORE9XOwoKICBpZiggbkNoYW5uZWxzID09IDIgJiYgY29tbW9uV2luZG93ID09IFRSVUUpCiAgewogICAgLyogY291bGQgYmUgYmV0dGVyIHdpdGggYSBjaGFubmVsIGxvb3AgKG5lZWQgYSBoYW5kbGUgdG8gcHN5X2RhdGEpICovCiAgICAvKiBnZXQgc3VnZ2VzdGVkIEJsb2NrIFR5cGVzIGFuZCBzeW5jaHJvbml6ZSAqLwogICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2VdOwogICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlXTsKCiAgICAvKiBzYW5pdHkgY2hlY2sgKG5vIGNoYW5nZSBmcm9tIGxvdyBvdmVybGFwIHdpbmRvdyB0byBzaG9ydCB3aW5vdyBhbmQgdmljZSB2ZXJzYSkgKi8KICAgIGlmIChwYXRjaFR5cGUgPT0gV1JPTkdfV0lORE9XKQogICAgICByZXR1cm4gLTE7IC8qIG1peGVkIHVwIEFBQy1MQyBhbmQgQUFDLUxEICovCgogICAgLyogU2V0IHN5bmNocm9uaXplZCBCbG9ja3R5cGUgKi8KICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAgPSBwYXRjaFR5cGU7CiAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOwoKICAgIC8qIHVwZGF0ZSB3aW5kb3cgc2hhcGUgKi8KICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NoYXBlICA9IGJsb2NrVHlwZTJ3aW5kb3dTaGFwZVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5hbGxvd1Nob3J0RnJhbWVzXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2VdOwogICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NoYXBlID0gYmxvY2tUeXBlMndpbmRvd1NoYXBlW2Jsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXNdW2Jsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2VdOwogIH0KCiAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmFsbG93U2hvcnRGcmFtZXMpCiAgewogICAgaW50IGk7CgogICAgaWYoIG5DaGFubmVscyA9PSAyICkKICAgIHsKICAgICAgaWYgKGNvbW1vbldpbmRvdyA9PSBUUlVFKQogICAgICB7CiAgICAgICAgLyogU3luY2hyb25pemUgZ3JvdXBpbmcgaW5mbyAqLwogICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlOwogICAgICAgIGludCB3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZTsKCiAgICAgICAgLyogTG9uZyBCbG9ja3MgKi8KICAgICAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7CiAgICAgICAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLwogICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyAgID0gMTsKICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzICA9IDE7CiAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSAgPSAxOwogICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gMTsKCiAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQogICAgICAgICAgewogICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSAgPSAwOwogICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogU2hvcnQgQmxvY2tzICovCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiBpbiBjYXNlIGFsbCB0d28gY2hhbm5lbHMgd2VyZSBkZXRlY3RlZCBhcyBzaG9ydC1ibG9ja3MgYmVmb3JlIHN5bmNpbmcsIHVzZSB0aGUgZ3JvdXBpbmcgb2YgY2hhbm5lbCB3aXRoIGhpZ2hlciBtYXhXaW5kb3dOcmcgKi8KICAgICAgICAgIGlmKCAod2luZG93U2VxdWVuY2VMZWZ0T2xkICA9PSBTSE9SVF9XSU5ET1cpICYmCgkgICAgICAgICAgICAod2luZG93U2VxdWVuY2VSaWdodE9sZCA9PSBTSE9SVF9XSU5ET1cpICkKICAgICAgICAgIHsKICAgICAgICAgICAgaWYoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bWF4V2luZG93TnJnID4gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm1heFdpbmRvd05yZykgewoJICAgICAgICAgICAgLyogTGVmdCBDaGFubmVsIHdpbnMgKi8KCSAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKCSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspewoJICAgICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXTsKCSAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCSAgICAgICAgICAgIC8qIFJpZ2h0IENoYW5uZWwgd2lucyAqLwoJICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOwoJICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7CgkgICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwoJICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggKHdpbmRvd1NlcXVlbmNlTGVmdE9sZCAgPT0gU0hPUlRfV0lORE9XKSAmJgogICAgICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZVJpZ2h0T2xkICE9IFNIT1JUX1dJTkRPVykgKQogICAgICAgICAgewogICAgICAgICAgICAvKiBlbHNlIHVzZSBncm91cGluZyBvZiBzaG9ydC1ibG9jayBjaGFubmVsICovCiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT19PRl9HUk9VUFM7IGkrKyl7CiAgICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKCAod2luZG93U2VxdWVuY2VSaWdodE9sZCA9PSBTSE9SVF9XSU5ET1cpICYmCgkJICAgICAgICAgICAgICAgICh3aW5kb3dTZXF1ZW5jZUxlZnRPbGQgICE9IFNIT1JUX1dJTkRPVykgKQogICAgICAgICAgewogICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspewogICAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBzeW5jaW5nIGEgc3RhcnQgYW5kIHN0b3Agd2luZG93IC4uLiAqLwogICAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzICA9IDI7CiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gNDsKICAgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMV0gPSBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5bMV0gPSA0OwogICAgICAgICAgfQogICAgICAgIH0gLyogU2hvcnQgQmxvY2tzICovCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogc3RlcmVvLCBubyBjb21tb24gd2luZG93ICovCiAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKXsKICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPm5vT2ZHcm91cHMgID0gMTsKICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuWzBdID0gMTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UhPVNIT1JUX1dJTkRPVyl7CiAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bm9PZkdyb3VwcyAgPSAxOwogICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gMTsKICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTk9fT0ZfR1JPVVBTOyBpKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IC8qIGNvbW1vbiB3aW5kb3cgKi8KICAgIH0gZWxzZSB7CiAgICAgIC8qIE1vbm8gKi8KICAgICAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmxhc3RXaW5kb3dTZXF1ZW5jZSE9U0hPUlRfV0lORE9XKXsKICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzICA9IDE7CiAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOwoKICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX05PX09GX0dST1VQUzsgaSsrKQogICAgICAgIHsKICAgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9IC8qIGFsbG93U2hvcnRGcmFtZXMgKi8KCgogIC8qIFRyYW5zbGF0ZSBMT1dPVl9XSU5ET1cgYmxvY2sgdHlwZSB0byBhIG1lYW5pbmdmdWwgd2luZG93IHNoYXBlLiAqLwogIGlmICggISBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5hbGxvd1Nob3J0RnJhbWVzICkgewogICAgaWYgKCBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gTE9OR19XSU5ET1cKICAgICAgJiYgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlICE9IFNUT1BfV0lORE9XICkKICAgIHsKICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bGFzdFdpbmRvd1NlcXVlbmNlID0gTE9OR19XSU5ET1c7CiAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPndpbmRvd1NoYXBlID0gTE9MX1dJTkRPVzsKICAgIH0KICB9CiAgaWYgKG5DaGFubmVscyA9PSAyKSB7CiAgICBpZiAoICEgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmFsbG93U2hvcnRGcmFtZXMgKSB7CiAgICAgIGlmICggYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSAhPSBMT05HX1dJTkRPVwogICAgICAgICYmIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5sYXN0V2luZG93U2VxdWVuY2UgIT0gU1RPUF9XSU5ET1cgKQogICAgICB7CiAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmxhc3RXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOwogICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT53aW5kb3dTaGFwZSA9IExPTF9XSU5ET1c7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiAwOwp9CgoK