Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaW5jbHVkZSAiZnJhbV9nZW4uaCIKI2luY2x1ZGUgInNicl9taXNjLmgiCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzIwNDggPSB7CiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIHsgMCwgMTZ9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgICAwLAogICAgICAgICAgICAgMSwKICAgICAgICAgICAgIHswLCAxNn0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIwNDggPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE2fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA4LCAxNn0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIwNDggPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTZ9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE2fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMjMwNCA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxOH0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxOH0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzIzMDQgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDksIDE4fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA5LCAxOH0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzIzMDQgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDUsICA5LCAxNCwgMTh9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDksIDE4fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTkyMCA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxNX0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAxNX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzE5MjAgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE1fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA4LCAxNX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzE5MjAgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDQsICA4LCAxMiwgMTV9LAogICAgICAgICAgICB7RlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSCwgRlJFUV9SRVNfSElHSH0sCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDgsIDE1fSB9OwoKc3RhdGljIGNvbnN0IFNCUl9GUkFNRV9JTkZPIGZyYW1lSW5mbzFfMTE1MiA9IHsKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAgOX0sCiAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgeyAwLCAgOX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzExNTIgPSB7CiAgICAgICAgICAgIDIsCiAgICAgICAgICAgIHsgMCwgIDUsICA5fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzExNTIgPSB7CiAgICAgICAgICAgIDQsCiAgICAgICAgICAgIHsgMCwgIDIsICA1LAogICAgICAgICAgICAgIDcsICA5fSwKICAgICAgICAgICAge0ZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9LAogICAgICAgICAgICAwLAogICAgICAgICAgICAyLAogICAgICAgICAgICB7IDAsICA1LCAgOX0gfTsKCgovKiBBQUNMRCBmcmFtZSBpbmZvICovCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8xXzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgIHswLCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgezAsIDh9fTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm8yXzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgIHswLCA0LCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKCnN0YXRpYyBjb25zdCBTQlJfRlJBTUVfSU5GTyBmcmFtZUluZm80XzUxMkxEID0gewogICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgIHswLCAyLCA0LCA2LCA4fSwKICAgICAgICAgICAgICAgICAgIHtGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdIfSwKICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgezAsIDQsIDh9fTsKCnN0YXRpYyBpbnQKY2FsY0ZpbGxMZW5ndGhNYXggKGludCB0cmFuUG9zLCAgICAgICAgICAvKiE8IGlucHV0IDogdHJhbnNpZW50IHBvc2l0aW9uIChyZWY6IHRyYW4gZGV0KSAqLwogICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cyAgIC8qITwgaW5wdXQgOiBudW1iZXIgb2YgdGltZXNsb3RzICovCiAgICAgICAgICAgICAgICAgICApOwoKc3RhdGljIHZvaWQKZmlsbEZyYW1lVHJhbiAoY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sICAgICAgLyohPCB0dW5pbmc6IGRlc2lyZWQgc2VnbWVudCBsZW5ndGhzICovCiAgICAgICAgICAgICAgIGNvbnN0IGludCAqdl90dW5pbmdGcmVxLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgdHJhbiwgICAgICAgICAgICAgICAgICAgICAvKiE8IGlucHV0IDogcG9zaXRpb24gb2YgdHJhbnNpZW50ICovCiAgICAgICAgICAgICAgIGludCAqdl9ib3JkLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBib3JkZXJzICovCiAgICAgICAgICAgICAgIGludCAqbGVuZ3RoX3ZfYm9yZCwgICAgICAgICAgIC8qITwgbWVtTmV3OiAjIGJvcmRlcnMgKi8KICAgICAgICAgICAgICAgaW50ICp2X2ZyZXEsICAgICAgICAgICAgICAgICAgLyohPCBtZW1OZXc6IGZyZXF1ZW5jeSByZXNvbHV0aW9ucyAqLwogICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2ZyZXEsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KICAgICAgICAgICAgICAgaW50ICpibWluLCAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGZpcnN0IG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgaW50ICpibWF4ICAgICAgICAgICAgICAgICAgICAgLyohPCBobHBOZXc6IGxhc3QgIG1hbmRhdG9yeSBib3JkZXIgKi8KICAgICAgICAgICAgICAgKTsKCnN0YXRpYyB2b2lkIGZpbGxGcmFtZVByZSAoSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHJlc3QpOwoKc3RhdGljIHZvaWQgZmlsbEZyYW1lUG9zdCAoSU5UICpwYXJ0cywgSU5UICpkLCBJTlQgZG1heCwgSU5UICp2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UIGJtYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzLCBJTlQgZm1heCk7CgpzdGF0aWMgdm9pZCBmaWxsRnJhbWVJbnRlciAoSU5UICpuTCwgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20sIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgYm1pbiwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgSU5UIGlfZmlsbEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkbWluLCBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cyk7CgpzdGF0aWMgdm9pZCBjYWxjRnJhbWVDbGFzcyAoRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3MsIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkLCBJTlQgdHJhbkZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNwcmVhZEZsYWcpOwoKc3RhdGljIHZvaWQgc3BlY2lhbENhc2UgKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqcGFydHMsIElOVCBkKTsKCnN0YXRpYyB2b2lkIGNhbGNDbW9uQm9yZGVyIChJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgdHJhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBidWZmZXJGcmFtZVN0YXJ0LCBJTlQgbnVtYmVyVGltZVNsb3RzKTsKCnN0YXRpYyB2b2lkIGtlZXBGb3JGb2xsb3dVcCAoSU5UICp2X2JvcmRGb2xsb3csIElOVCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfZnJlcUZvbGxvdywgSU5UICpsZW5ndGhfdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqaV90cmFuRm9sbG93LCBJTlQgKmlfZmlsbEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLCBJTlQgKnZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaV9jbW9uLCBJTlQgaV90cmFuLCBJTlQgcGFydHMsIElOVCBudW1iZXJUaW1lU2xvdHMpOwoKc3RhdGljIHZvaWQgY2FsY0N0cmxTaWduYWwgKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqdl9ib3JkLCBJTlQgbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuZ3RoX3ZfZnJlcSwgSU5UIGlfY21vbiwgSU5UIGlfdHJhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzcHJlYWRGbGFnLCBJTlQgbkwpOwoKc3RhdGljIHZvaWQgY3RybFNpZ25hbDJGcmFtZUluZm8gKEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoRnJhbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeCk7CgoKLyogdGFibGUgZm9yIDggdGltZSBzbG90IGluZGV4ICovCnN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV84IFs4XVs1XSA9IHsKLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KLyogYm9yZGVycyBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCiAgICAvKlt8VC18LS0tLS0tXSovICB7IDIsIDAsIDAsIDEsIC0xIH0sCiAgICAvKlt8LVQtfC0tLS0tXSovICB7IDIsIDAsIDAsIDIsIC0xIH0sCiAgICAvKlstLXxULXwtLS0tXSovICB7IDMsIDEsIDEsIDIsICA0IH0sCiAgICAvKlstLS18VC18LS0tXSovICB7IDMsIDEsIDEsIDMsICA1IH0sCiAgICAvKlstLS0tfFQtfC0tXSovICB7IDMsIDEsIDEsIDQsICA2IH0sCiAgICAvKlstLS0tLXxULS18XSovICB7IDIsIDEsIDEsIDUsIC0xIH0sCiAgICAvKlstLS0tLS18VC18XSovICB7IDIsIDEsIDEsIDYsIC0xIH0sCiAgICAvKlstLS0tLS0tfFR8XSovICB7IDIsIDEsIDEsIDcsIC0xIH0sCn07CgovKiB0YWJsZSBmb3IgMTYgdGltZSBzbG90IGluZGV4ICovCnN0YXRpYyBjb25zdCBpbnQgZW52ZWxvcGVUYWJsZV8xNiBbMTZdWzZdID0gewogICAgLyogdHJhbnNpZW50SW5kZXggIG5FbnYsIHRyYW5JZHgsIHNob3J0RW52LCBib3JkZXIxLCBib3JkZXIyLCAuLi4gKi8KICAgIC8qIGxlbmd0aCBmcm9tIGxlZnQgdG8gcmlnaHQgc2lkZTsgLTEgPSBub3QgaW4gdXNlICovCiAgICAvKlt8VC0tLXwtLS0tLS0tLS0tLS18XSovIHsgMiwgMCwgMCwgNCwgLTEsIC0xfSwKICAgIC8qW3wtVC0tLXwtLS0tLS0tLS0tLXxdKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAogICAgLypbfC0tfFQtLS18LS0tLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDIsICA2LCAtMX0sCiAgICAvKlt8LS0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMywgIDcsIC0xfSwKICAgIC8qW3wtLS0tfFQtLS18LS0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAogICAgLypbfC0tLS0tfFQtLS18LS0tLS0tLV0qLyB7IDMsIDEsIDEsIDUsICA5LCAtMX0sCiAgICAvKlt8LS0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNiwgMTAsIC0xfSwKICAgIC8qW3wtLS0tLS0tfFQtLS18LS0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAogICAgLypbfC0tLS0tLS0tfFQtLS18LS0tLV0qLyB7IDMsIDEsIDEsIDgsIDEyLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOSwgMTMsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tfFQtLS18LS1dKi8geyAzLCAxLCAxLDEwLCAxNCwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tfFQtLS0tfF0qLyB7IDIsIDEsIDEsMTEsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMiwgLTEsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tLS0tfFQtLXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tLS0tfFQtfF0qLyB7IDIsIDEsIDEsMTQsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNSwgLTEsIC0xfSwKfTsKCi8qIHRhYmxlIGZvciAxNSB0aW1lIHNsb3QgaW5kZXggKi8Kc3RhdGljIGNvbnN0IGludCBlbnZlbG9wZVRhYmxlXzE1IFsxNV1bNl0gPSB7CiAgICAvKiB0cmFuc2llbnRJbmRleCAgbkVudiwgdHJhbklkeCwgc2hvcnRFbnYsIGJvcmRlcjEsIGJvcmRlcjIsIC4uLiAqLwogICAgLyogbGVuZ3RoIGZyb20gbGVmdCB0byByaWdodCBzaWRlOyAtMSA9IG5vdCBpbiB1c2UgKi8KICAgIC8qW3xULS0tfC0tLS0tLS0tLS0tLV0qLyB7IDIsIDAsIDAsIDQsIC0xLCAtMX0sCiAgICAvKlt8LVQtLS18LS0tLS0tLS0tLS1dKi8geyAyLCAwLCAwLCA1LCAtMSwgLTF9LAogICAgLypbfC0tfFQtLS18LS0tLS0tLS0tXSovIHsgMywgMSwgMSwgMiwgIDYsIC0xfSwKICAgIC8qW3wtLS18VC0tLXwtLS0tLS0tLV0qLyB7IDMsIDEsIDEsIDMsICA3LCAtMX0sCiAgICAvKlt8LS0tLXxULS0tfC0tLS0tLS1dKi8geyAzLCAxLCAxLCA0LCAgOCwgLTF9LAogICAgLypbfC0tLS0tfFQtLS18LS0tLS0tXSovIHsgMywgMSwgMSwgNSwgIDksIC0xfSwKICAgIC8qW3wtLS0tLS18VC0tLXwtLS0tLV0qLyB7IDMsIDEsIDEsIDYsIDEwLCAtMX0sCiAgICAvKlt8LS0tLS0tLXxULS0tfC0tLS1dKi8geyAzLCAxLCAxLCA3LCAxMSwgLTF9LAogICAgLypbfC0tLS0tLS0tfFQtLS18LS0tXSovIHsgMywgMSwgMSwgOCwgMTIsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS18VC0tLXwtLV0qLyB7IDMsIDEsIDEsIDksIDEzLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLXxULS0tLXxdKi8geyAyLCAxLCAxLDEwLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tfFQtLS18XSovIHsgMiwgMSwgMSwxMSwgLTEsIC0xfSwKICAgIC8qW3wtLS0tLS0tLS0tLS18VC0tfF0qLyB7IDIsIDEsIDEsMTIsIC0xLCAtMX0sCiAgICAvKlt8LS0tLS0tLS0tLS0tLXxULXxdKi8geyAyLCAxLCAxLDEzLCAtMSwgLTF9LAogICAgLypbfC0tLS0tLS0tLS0tLS0tfFR8XSovIHsgMiwgMSwgMSwxNCwgLTEsIC0xfSwKfTsKCnN0YXRpYyBjb25zdCBpbnQgbWluRnJhbWVUcmFuRGlzdGFuY2UgPSA0OwoKc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfOFtdID0ge0ZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLAogIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0h9OwoKc3RhdGljIGNvbnN0IEZSRVFfUkVTIGZyZXFSZXNfdGFibGVfMTZbMTZdID0gewogICAgLyogc2l6ZSBvZiBlbnZlbG9wZSAqLwovKiAwLTQgKi8gICAgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0xPVywgRlJFUV9SRVNfTE9XLCBGUkVRX1JFU19MT1csCi8qIDUtOSAqLyAgICBGUkVRX1JFU19MT1csIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsIEZSRVFfUkVTX0hJR0gsCi8qIDEwLTE2ICovICBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILCBGUkVRX1JFU19ISUdILAogICAgICAgICAgICAgRlJFUV9SRVNfSElHSCB9OwoKc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5ICggSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfR1JJRCBoU2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCgovKiEKICBGdW5jdGlvbm5hbWU6IEZES3NickVuY19mcmFtZUluZm9HZW5lcmF0b3IKCiAgRGVzY3JpcHRpb246ICBwcm9kdWNlcyB0aGUgRlJBTUVfSU5GTyBzdHJ1Y3QgZm9yIHRoZSBjdXJyZW50IGZyYW1lCgogIEFyZ3VtZW50czogICAgaFNickVudkZyYW1lICAgICAgICAgIC0gcG9pbnRlciB0byBzYnIgZW52ZWxvcGUgaGFuZGxlCiAgICAgICAgICAgICAgICB2X3ByZV90cmFuc2llbnRfaW5mbyAgLSBwb2ludGVyIHRvIHRyYW5zaWVudCBpbmZvIHZlY3RvcgogICAgICAgICAgICAgICAgdl90cmFuc2llbnRfaW5mbyAgICAgIC0gcG9pbnRlciB0byBwcmV2aW91cyB0cmFuc2llbnQgaW5mbyB2ZWN0b3IKICAgICAgICAgICAgICAgIHZfdHVuaW5nICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gdHVuaW5nIHZlY3RvcgoKIFJldHVybjogICAgICBmcmFtZV9pbmZvICAgICAgICAtIHBvaW50ZXIgdG8gU0JSX0ZSQU1FX0lORk8gc3RydWN0CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpIQU5ETEVfU0JSX0ZSQU1FX0lORk8KRkRLc2JyRW5jX2ZyYW1lSW5mb0dlbmVyYXRvciAoSEFORExFX1NCUl9FTlZFTE9QRV9GUkFNRSBoU2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm8sCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfdHJhbnNpZW50X2luZm9fcHJlLAogICAgICAgICAgICAgICAgICAgIGludCBsZEdyaWQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICp2X3R1bmluZykKewogIElOVCBudW1FbnYsIHRyYW5Qb3NJbnRlcm5hbD0wLCBibWluPTAsIGJtYXg9MCwgcGFydHMsIGQsIGlfY21vbj0wLCBpX3RyYW49MCwgbkw7CiAgSU5UIGZtYXggPSAwOwoKICBJTlQgKnZfYm9yZCA9IGhTYnJFbnZGcmFtZS0+dl9ib3JkOwogIElOVCAqdl9mcmVxID0gaFNickVudkZyYW1lLT52X2ZyZXE7CiAgSU5UICp2X2JvcmRGb2xsb3cgPSBoU2JyRW52RnJhbWUtPnZfYm9yZEZvbGxvdzsKICBJTlQgKnZfZnJlcUZvbGxvdyA9IGhTYnJFbnZGcmFtZS0+dl9mcmVxRm9sbG93OwoKCiAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfYm9yZEZvbGxvdzsKICBJTlQgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSAmaFNickVudkZyYW1lLT5sZW5ndGhfdl9mcmVxRm9sbG93OwogIElOVCAqbGVuZ3RoX3ZfYm9yZCA9ICZoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQ7CiAgSU5UICpsZW5ndGhfdl9mcmVxID0gJmhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcTsKICBJTlQgKnNwcmVhZEZsYWcgPSAmaFNickVudkZyYW1lLT5zcHJlYWRGbGFnOwogIElOVCAqaV90cmFuRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+aV90cmFuRm9sbG93OwogIElOVCAqaV9maWxsRm9sbG93ID0gJmhTYnJFbnZGcmFtZS0+aV9maWxsRm9sbG93OwogIEZSQU1FX0NMQVNTICpmcmFtZUNsYXNzT2xkID0gJmhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZDsKICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzID0gRklYRklYOwoKCiAgSU5UIGFsbG93U3ByZWFkID0gaFNickVudkZyYW1lLT5hbGxvd1NwcmVhZDsKICBJTlQgbnVtRW52U3RhdGljID0gaFNickVudkZyYW1lLT5udW1FbnZTdGF0aWM7CiAgSU5UIHN0YXRpY0ZyYW1pbmcgPSBoU2JyRW52RnJhbWUtPnN0YXRpY0ZyYW1pbmc7CiAgSU5UIGRtaW4gPSBoU2JyRW52RnJhbWUtPmRtaW47CiAgSU5UIGRtYXggPSBoU2JyRW52RnJhbWUtPmRtYXg7CgogIElOVCBidWZmZXJGcmFtZVN0YXJ0ID0gaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQ7CiAgSU5UIG51bWJlclRpbWVTbG90cyA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5udW1iZXJUaW1lU2xvdHM7CiAgSU5UIGZyYW1lTWlkZGxlU2xvdCA9IGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90OwoKICBJTlQgdHJhblBvcyA9IHZfdHJhbnNpZW50X2luZm9bMF07CiAgSU5UIHRyYW5GbGFnID0gdl90cmFuc2llbnRfaW5mb1sxXTsKCiAgY29uc3QgaW50ICp2X3R1bmluZ1NlZ20gPSB2X3R1bmluZzsKICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSA9IHZfdHVuaW5nICsgMzsKCiAgaFNickVudkZyYW1lLT52X3R1bmluZ1NlZ20gPSB2X3R1bmluZ1NlZ207CiAgSU5UIGZyZXFfcmVzX2ZpeGZpeCA9IGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4OwoKICBpZiAobGRHcmlkKSB7CiAgICAvKiBpbiBjYXNlIHRoZXJlIHdhcyBhIHRyYW5zaWVudCBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHByZXZpb3VzIGZyYW1lLCBzdGFydCB3aXRoIGEgdHJhbnNpZW50IGVudmVsb3BlICovCiAgICBpZih2X3RyYW5zaWVudF9pbmZvX3ByZVsxXSAmJiAobnVtYmVyVGltZVNsb3RzIC0gdl90cmFuc2llbnRfaW5mb19wcmVbMF0gPCBtaW5GcmFtZVRyYW5EaXN0YW5jZSkpewogICAgICB0cmFuRmxhZyA9IDE7CiAgICAgIHRyYW5Qb3MgID0gMDsKICAgIH0KICB9CgogIC8qCiAgICogU3lub3BzaXM6CiAgICoKICAgKiBUaGUgZnJhbWUgZ2VuZXJhdG9yIGNyZWF0ZXMgdGhlIHRpbWUtL2ZyZXF1ZW5jeS1ncmlkIGZvciBvbmUgU0JSIGZyYW1lLgogICAqIElucHV0IHNpZ25hbHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSB0cmFuc2llbnQgZGV0ZWN0b3IgYW5kIHRoZSBmcmFtZQogICAqIHNwbGl0dGVyICh0cmFuc2llbnREZXRlY3ROZXcoKSAmIEZyYW1lU3BsaXR0ZXIoKSBpbiB0cmFuX2RldC5jKS4gIFRoZQogICAqIGZyYW1pbmcgaXMgY29udHJvbGxlZCBieSBhZGp1c3RpbmcgdHVuaW5nIHBhcmFtZXRlcnMgc3RvcmVkIGluCiAgICogRlJBTUVfR0VOX1RVTklORy4gIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBkZXBlbmRlbnQgb24gZnJhbWUgbGVuZ3RocwogICAqIGFuZCBiaXRyYXRlcywgYW5kIG1heSBpbiB0aGUgZnV0dXJlIGJlIHNpZ25hbCBkZXBlbmRlbnQuCiAgICoKICAgKiBUaGUgZW52ZWxvcGUgYm9yZGVycyBhcmUgc3RvcmVkIGZvciBmcmFtZSBnZW5lcmF0b3IgaW50ZXJuYWwgdXNlIGluCiAgICogYUJvcmRlcnMuICBUaGUgY29udGVudHMgb2YgYUJvcmRlcnMgcmVwcmVzZW50IHBvc2l0aW9ucyBhbG9uZyB0aGUgdGltZQogICAqIGF4aXMgZ2l2ZW4gaW4gdGhlIGZpZ3VyZXMgaW4gZnJhbV9nZW4uaCAodGhlICJmcmFtZS1nZW5lcmF0b3IiIHJvd3MpLgogICAqIFRoZSB1bml0IGlzICJ0aW1lIHNsb3QiLiAgVGhlIGZpZ3VyZXMgaW4gZnJhbV9nZW4uaCBhbHNvIGRlZmluZSB0aGUKICAgKiBkZXRlY3Rpb24gcmFuZ2VzIGZvciB0aGUgdHJhbnNpZW50IGRldGVjdG9yLiAgRm9yIGV2ZXJ5IGJvcmRlciBpbgogICAqIGFCb3JkZXJzLCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gYUZyZXFSZXMsIHdoaWNoIGRlZmluZXMgdGhlCiAgICogZnJlcXVlbmN5IHJlc29sdXRpb24gb2YgdGhlIGVudmVsb3BlIGZvbGxvd2luZyAoZGVsaW1pdGVkIGJ5KSB0aGUKICAgKiBib3JkZXIuCiAgICoKICAgKiBXaGVuIG5vIHRyYW5zaWVudHMgYXJlIHByZXNlbnQsIEZJWEZJWCBjbGFzcyBmcmFtZXMgYXJlIHVzZWQuICBUaGUKICAgKiBmcmFtZSBzcGxpdHRlciBkZWNpZGVzIHdoZXRoZXIgdG8gdXNlIG9uZSBvciB0d28gZW52ZWxvcGVzIGluIHRoZQogICAqIEZJWEZJWCBmcmFtZS4gICJTcGFyc2UgdHJhbnNpZW50cyIgKHNlcGFyYXRlZCBieSBhIGZldyBmcmFtZXMgd2l0aG91dAogICAqIHRyYW5zaWVudHMpIGFyZSBoYW5kZWxlZCBieSBbRklYVkFSLCBWQVJGSVhdIHBhaXJzIG9yIChkZXBlbmRpbmcgb24KICAgKiB0dW5pbmcgYW5kIHRyYW5zaWVudCBwb3NpdGlvbiByZWxhdGl2ZSB0aGUgbm9taW5hbCBmcmFtZSBib3VuZGFyaWVzKQogICAqIGJ5IFtGSVhWQVIsIFZBUlZBUiwgVkFSRklYXSB0cmlwbGVzLiAgIlRpZ2h0IHRyYW5zaWVudHMiIChpbgogICAqIGNvbnNlY3V0aXZlIGZyYW1lcykgYXJlIGhhbmRlbGVkIGJ5IFsuLi4sIFZBUlZBUiwgVkFSVkFSLCAuLi5dCiAgICogc2VxdWVuY2VzLgogICAqCiAgICogVGhlIGdlbmVyYXRvciBhc3N1bWVzIHRoYXQgdHJhbnNpZW50cyBhcmUgInNwYXJzZSIsIGFuZCBkZXNpZ25zCiAgICogYm9yZGVycyBmb3IgW0ZJWFZBUiwgVkFSRklYXSBwYWlycyByaWdodCBhd2F5LCB3aGVyZSB0aGUgZmlyc3QgZnJhbWUKICAgKiBjb3JyZXNwb25kcyB0byB0aGUgcHJlc2VudCBmcmFtZS4gIEF0IHRoZSBuZXh0IGNhbGwgb2YgdGhlIGdlbmVyYXRvcgogICAqIGl0IGlzIGtub3duIHdoZXRoZXIgdGhlIHRyYW5zaWVudCBhY3R1YWxseSBpcyAic3BhcnNlIiBvciBub3QuICBJZgogICAqICd5ZXMnLCB0aGUgYWxyZWFkeSBjYWxjdWxhdGVkIFZBUkZJWCBib3JkZXJzIGFyZSB1c2VkLiAgSWYgJ25vJywgbmV3CiAgICogYm9yZGVycywgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSAidGlnaHQiIHRyYW5zaWVudCwgYXJlCiAgICogY2FsY3VsYXRlZC4KICAgKgogICAqIFRoZSBnZW5lcmF0b3IgcHJvZHVjZXMgdHdvIG91dHB1dHM6ICBBICJjbGVhci10ZXh0IGJpdHN0cmVhbSIgc3RvcmVkIGluCiAgICogU0JSX0dSSUQsIGFuZCBhIHN0cmFpZ2h0LWZvcndhcmQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyaWQgc3RvcmVkIGluCiAgICogU0JSX0ZSQU1FX0lORk8uICBUaGUgZm9ybWVyIGlzIHN1YnNlcXVlbnRseSBjb252ZXJ0ZWQgdG8gdGhlIGFjdHVhbAogICAqIGJpdHN0cmVhbSBzYnJfZ3JpZCgpIChlbmNvZGVTYnJHcmlkKCkgaW4gYml0X3Nici5jKS4gIFRoZSBsYXR0ZXIgaXMKICAgKiB1c2VkIGJ5IG90aGVyIGVuY29kZXIgZnVuY3Rpb25zLCBzdWNoIGFzIHRoZSBlbnZlbG9wZSBlc3RpbWF0b3IKICAgKiAoY2FsY3VsYXRlU2JyRW52ZWxvcGUoKSBpbiBlbnZfZXN0LmMpIGFuZCB0aGUgbm9pc2UgZmxvb3IgYW5kIG1pc3NpbmcKICAgKiBoYXJtb25pY3MgZGV0ZWN0b3IgKFRvbkNvcnJQYXJhbUV4dHIoKSBpbiBuZl9lc3QuYykuCiAgICovCgogIGlmIChzdGF0aWNGcmFtaW5nKSB7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIElnbm9yZSB0cmFuc2llbnQgZGV0ZWN0b3IKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZnJhbWVDbGFzcyA9IEZJWEZJWDsKICAgIG51bUVudiA9IG51bUVudlN0YXRpYzsgICAgICAvKiB7MSwyLDQsOH0gKi8KICAgICpmcmFtZUNsYXNzT2xkID0gRklYRklYOyAgICAvKiBmb3IgY2hhbmdlIHRvIGR5biAqLwogICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CiAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CiAgfQogIGVsc2UgewogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBDYWxjdWxhdGUgZnJhbWUgY2xhc3MgdG8gdXNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2FsY0ZyYW1lQ2xhc3MgKCZmcmFtZUNsYXNzLCBmcmFtZUNsYXNzT2xkLCB0cmFuRmxhZywgc3ByZWFkRmxhZyk7CgogICAgLyogcGF0Y2ggZm9yIG5ldyBmcmFtZSBjbGFzcyBGSVhGSVhvbmx5IGZvciBBQUMgTEQgKi8KICAgIGlmICh0cmFuRmxhZyAmJiBsZEdyaWQpIHsKICAgICAgZnJhbWVDbGFzcyAgICAgPSBGSVhGSVhvbmx5OwogICAgICAqZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKICAgIH0KCiAgICAvKgogICAgICogZXZlcnkgdHJhbnNpZW50IGlzIHByb2Nlc3NlZCBiZWxvdyBieSBpbnNlcnRpbmcKICAgICAqCiAgICAgKiAtIG9uZSBib3JkZXIgYXQgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQKICAgICAqIC0gb25lIG9yIG1vcmUgImRlY2F5IGJvcmRlcnMiIChhZnRlciB0aGUgb25zZXQgb2YgdGhlIHRyYW5zaWVudCkKICAgICAqIC0gb3B0aW9uYWxseSBvbmUgImF0dGFjayBib3JkZXIiIChiZWZvcmUgdGhlIG9uc2V0IG9mIHRoZSB0cmFuc2llbnQpCiAgICAgKgogICAgICogdGhvc2UgYm9yZGVycyBhcmUgcmVmZXJyZWQgdG8gYXMgIm1hbmRhdG9yeSBib3JkZXJzIiBhbmQgYXJlCiAgICAgKiBkZWZpbmVkIGJ5IHRoZSAnc2VnbWVudExlbmd0aCcgYXJyYXkgaW4gRlJBTUVfR0VOX1RVTklORwogICAgICoKICAgICAqIHRoZSBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZW52ZWxvcGVzIGFyZQogICAgICogZGVmaW5lZCBieSB0aGUgJ3NlZ21lbnRSZXMnIGFycmF5IGluIEZSQU1FX0dFTl9UVU5JTkcKICAgICAqLwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgRGVzaWduIGZyYW1lIChvciBmb2xsb3ctdXAgb2xkIGRlc2lnbikKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAodHJhbkZsYWcpIHsgICAgICAgICAgICAgLyogQWx3YXlzIGZvciBGaXhWYXIsIG9mdGVuIGJ1dCBub3QgYWx3YXlzIGZvciBWYXJWYXIgKi8KICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIERlc2lnbiBwYXJ0IG9mIFQvRi1ncmlkIGFyb3VuZCB0aGUgbmV3IHRyYW5zaWVudAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgdHJhblBvc0ludGVybmFsID0gZnJhbWVNaWRkbGVTbG90ICsgdHJhblBvcyArIGJ1ZmZlckZyYW1lU3RhcnQgOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAgICAgIC8qCiAgICAgICAgYWRkIG1hbmRhdG9yeSBib3JkZXJzIGFyb3VuZCB0cmFuc2llbnQKICAgICAgKi8KCiAgICAgIGZpbGxGcmFtZVRyYW4gKCB2X3R1bmluZ1NlZ20sCiAgICAgICAgICAgICAgICAgICAgICB2X3R1bmluZ0ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICB0cmFuUG9zSW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICB2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLAogICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgJmJtaW4sCiAgICAgICAgICAgICAgICAgICAgICZibWF4ICk7CgogICAgICAvKiBtYWtlIHN1cmUgd2Ugc3RheSB3aXRoaW4gdGhlIG1heGltdW0gU0JSIGZyYW1lIG92ZXJsYXAgKi8KICAgICAgZm1heCA9IGNhbGNGaWxsTGVuZ3RoTWF4KHRyYW5Qb3MsIG51bWJlclRpbWVTbG90cyk7CiAgICB9CgogICAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CgogICAgY2FzZSBGSVhGSVhvbmx5OgogICAgICBGREtfQVNTRVJUKGxkR3JpZCk7CiAgICAgIHRyYW5Qb3NJbnRlcm5hbCA9IHRyYW5Qb3M7CiAgICAgIGdlbmVyYXRlRml4Rml4T25seSAoICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhTYnJFbnZGcmFtZS0+U2JyR3JpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICByZXR1cm4gJihoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbyk7CgogICAgY2FzZSBGSVhWQVI6CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZpbGwgcmVnaW9uIGJlZm9yZSBuZXcgdHJhbnNpZW50OgogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLAogICAgICAgICAgICAgICAgICAgIGJtaW4sIGJtaW4gLSBidWZmZXJGcmFtZVN0YXJ0KTsgICAgIC8qIEZIIDAwLTA2LTI2ICovCgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgRmlsbCByZWdpb24gYWZ0ZXIgbmV3IHRyYW5zaWVudDoKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgZmlsbEZyYW1lUG9zdCAoJnBhcnRzLCAmZCwgZG1heCwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEsIGJtYXgsIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cywgZm1heCk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgVGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZToKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAgIC8qIG5vIGZpbGwsIHNob3J0IGxhc3QgZW52ZWxvcGUgKi8KICAgICAgICBzcGVjaWFsQ2FzZSAoc3ByZWFkRmxhZywgYWxsb3dTcHJlYWQsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwKICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENhbGN1bGF0ZSBjb21tb24gYm9yZGVyIChzcGxpdC1wb2ludCkKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgY2FsY0Ntb25Cb3JkZXIgKCZpX2Ntb24sICZpX3RyYW4sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdHJhblBvc0ludGVybmFsLAogICAgICAgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVTdGFydCwgbnVtYmVyVGltZVNsb3RzKTsgICAgICAgLyogRkggMDAtMDYtMjYgKi8KCiAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBFeHRyYWN0IGRhdGEgZm9yIHByb3BlciBmb2xsb3ctdXAgaW4gbmV4dCBmcmFtZQogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBrZWVwRm9yRm9sbG93VXAgKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXFGb2xsb3csIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBpX2Ntb24sIGlfdHJhbiwgcGFydHMsIG51bWJlclRpbWVTbG90cyk7ICAvKiBGSCAwMC0wNi0yNiAqLwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIENhbGN1bGF0ZSBjb250cm9sIHNpZ25hbAogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwgZnJhbWVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgIHZfYm9yZCwgKmxlbmd0aF92X2JvcmQsIHZfZnJlcSwgKmxlbmd0aF92X2ZyZXEsCiAgICAgICAgICAgICAgICAgICAgICBpX2Ntb24sIGlfdHJhbiwgKnNwcmVhZEZsYWcsIERDKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZBUkZJWDoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgIGNhbGNDdHJsU2lnbmFsICgmaFNickVudkZyYW1lLT5TYnJHcmlkLCBmcmFtZUNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3csIERDLCAqaV90cmFuRm9sbG93LAogICAgICAgICAgICAgICAgICAgICAgKnNwcmVhZEZsYWcsIERDKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZBUlZBUjoKICAgICAgaWYgKCpzcHJlYWRGbGFnKSB7ICAgICAgICAvKiBzcHJlYWQgYWNyb3NzIHRocmVlIGZyYW1lcyAqLwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEZvbGxvdy11cCBvbGQgdHJhbnNpZW50IC0gY2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDbGFzcywgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxRm9sbG93LCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgREMsCiAgICAgICAgICAgICAgICAgICAgICAgICppX3RyYW5Gb2xsb3csICpzcHJlYWRGbGFnLCBEQyk7CgogICAgICAgICpzcHJlYWRGbGFnID0gMDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRXh0cmFjdCBkYXRhIGZvciBwcm9wZXIgZm9sbG93LXVwIGluIG5leHQgZnJhbWUKICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgICAgIHZfYm9yZEZvbGxvd1swXSA9IGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5ic19hYnNfYm9yZF8xIC0gbnVtYmVyVGltZVNsb3RzOyAvKiBGSCAwMC0wNi0yNiAqLwogICAgICAgIHZfZnJlcUZvbGxvd1swXSA9IDE7CiAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSAxOwogICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gMTsKCiAgICAgICAgKmlfdHJhbkZvbGxvdyA9IC1EQzsKICAgICAgICAqaV9maWxsRm9sbG93ID0gLURDOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIERlc2lnbiByZW1haW5pbmcgcGFydHMgb2YgVC9GLWdyaWQgKGFzc3VtaW5nIG5leHQgZnJhbWUgaXMgVmFyRml4KQogICAgICAgICAgYWRhcHQgb3IgZmlsbCByZWdpb24gYmVmb3JlIG5ldyB0cmFuc2llbnQ6CiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBmaWxsRnJhbWVJbnRlciAoJm5MLCB2X3R1bmluZ1NlZ20sIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3csIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcUZvbGxvdywgKmlfZmlsbEZvbGxvdywgZG1pbiwgZG1heCwKICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzKTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgRmlsbCBhZnRlciB0cmFuc2llbnQ6CiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBmaWxsRnJhbWVQb3N0ICgmcGFydHMsICZkLCBkbWF4LCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfZnJlcSwKICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxLCBibWF4LCBidWZmZXJGcmFtZVN0YXJ0LCBudW1iZXJUaW1lU2xvdHMsIGZtYXgpOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBUYWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlOgogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgICAgaWYgKHBhcnRzID09IDEgJiYgZCA8IGRtaW4pICAgICAvKiUgbm8gZmlsbCwgc2hvcnQgbGFzdCBlbnZlbG9wZSAqLwogICAgICAgICAgc3BlY2lhbENhc2UgKHNwcmVhZEZsYWcsIGFsbG93U3ByZWFkLCB2X2JvcmQsIGxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAmcGFydHMsIGQpOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICBDYWxjdWxhdGUgY29tbW9uIGJvcmRlciAoc3BsaXQtcG9pbnQpCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ21vbkJvcmRlciAoJmlfY21vbiwgJmlfdHJhbiwgdl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB0cmFuUG9zSW50ZXJuYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lU3RhcnQsIG51bWJlclRpbWVTbG90cyk7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIEV4dHJhY3QgZGF0YSBmb3IgcHJvcGVyIGZvbGxvdy11cCBpbiBuZXh0IGZyYW1lCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBrZWVwRm9yRm9sbG93VXAgKHZfYm9yZEZvbGxvdywgbGVuZ3RoX3ZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgIHZfZnJlcUZvbGxvdywgbGVuZ3RoX3ZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICAgICAgICAgIGlfdHJhbkZvbGxvdywgaV9maWxsRm9sbG93LCB2X2JvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkLCB2X2ZyZXEsIGlfY21vbiwgaV90cmFuLCBwYXJ0cywgbnVtYmVyVGltZVNsb3RzKTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgQ2FsY3VsYXRlIGNvbnRyb2wgc2lnbmFsCiAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICAgICBjYWxjQ3RybFNpZ25hbCAoJmhTYnJFbnZGcmFtZS0+U2JyR3JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDbGFzcywgdl9ib3JkLCAqbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcSwgaV9jbW9uLCBpX3RyYW4sIDAsIG5MKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgRklYRklYOgogICAgICBpZiAodHJhblBvcyA9PSAwKQogICAgICAgIG51bUVudiA9IDE7CiAgICAgIGVsc2UKICAgICAgICBudW1FbnYgPSAyOwoKICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJzX251bV9lbnYgPSBudW1FbnY7CiAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ29udmVydCBjb250cm9sIHNpZ25hbCB0byBmcmFtZSBpbmZvIHN0cnVjdAogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgY3RybFNpZ25hbDJGcmFtZUluZm8gKCZoU2JyRW52RnJhbWUtPlNickdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgZnJlcV9yZXNfZml4Zml4KTsKCiAgcmV0dXJuICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQogIFxicmllZiAgICBHbmVyYXRlcyBmcmFtZSBpbmZvIGZvciBGSVhGSVhvbmx5IGZyYW1lIGNsYXNzIHVzZWQgZm9yIGxvdyBkZWxheSB2ZXJzaW9uCgogIFxyZXR1cm4gICBub3RoaW5nCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBIQU5ETEVfU0JSX0ZSQU1FX0lORk8gaFNickZyYW1lSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhblBvc0ludGVybmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyVGltZVNsb3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgbkVudiwgaSwgaz0wLCB0cmFuSWR4OwogIGNvbnN0IGludCAqcFRhYmxlID0gTlVMTDsKICBjb25zdCBGUkVRX1JFUyAqZnJlcVJlc1RhYmxlID0gTlVMTDsKCiAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKICAgICAgY2FzZSA4OgogICAgICAgICAgcFRhYmxlID0gZW52ZWxvcGVUYWJsZV84W3RyYW5Qb3NJbnRlcm5hbF07CiAgICAgICAgICBmcmVxUmVzVGFibGUgPSBmcmVxUmVzX3RhYmxlXzg7CiAgICAgICAgICBicmVhazsKICAgICAgY2FzZSAxNToKICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfMTVbdHJhblBvc0ludGVybmFsXTsKICAgICAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfMTY7CiAgICAgICAgICBicmVhazsKICAgICAgY2FzZSAxNjoKICAgICAgICAgIHBUYWJsZSA9IGVudmVsb3BlVGFibGVfMTZbdHJhblBvc0ludGVybmFsXTsKICAgICAgICAgIGZyZXFSZXNUYWJsZSA9IGZyZXFSZXNfdGFibGVfMTY7CiAgICAgICAgICBicmVhazsKICB9CgogIC8qIGxvb2sgbnVtYmVyIG9mIGVudm9scGVzIGluIHRhYmxlICovCiAgbkVudiA9IHBUYWJsZVswXTsKICAvKiBsb29rIHVwIGVudm9scGUgZGlzdHJpYnV0aW9uIGluIHRhYmxlICovCiAgZm9yIChpPTE7IGk8bkVudjsgaSsrKQogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IHBUYWJsZVtpKzJdOwoKICAvKiBvcGVuIGFuZCBjbG9zZSBmcmFtZSBib3JkZXIgKi8KICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdICAgID0gMDsKICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOwoKICAvKiBhZGp1c3Qgc2VnbWVudC1mcmVxdWVuY3ktcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlZ21lbnQtbGVuZ3RoICovCiAgZm9yIChpPTA7IGk8bkVudjsgaSsrKXsKICAgIGsgPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2krMV0gLSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2ldOwogICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IGZyZXFSZXNUYWJsZVtrXTsKICAgIGhTYnJHcmlkLT52X2ZbaV0gPSBmcmVxUmVzVGFibGVba107CiAgfQoKICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiAgID0gcFRhYmxlWzJdOwogIC8qIHRyYW5zaWVudCBpZHggKi8KICB0cmFuSWR4ID0gcFRhYmxlWzFdOwoKICAvKiBhZGQgbm9pc2UgZmxvb3JzICovCiAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gMDsKICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW3RyYW5JZHg/dHJhbklkeDoxXTsKICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBudW1iZXJUaW1lU2xvdHM7CiAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKCiAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBGSVhGSVhvbmx5OwogIGhTYnJHcmlkLT5ic19hYnNfYm9yZCA9IHRyYW5Qb3NJbnRlcm5hbDsKICBoU2JyR3JpZC0+YnNfbnVtX2VudiA9IG5FbnY7Cgp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogICBoU2JyRW52RnJhbWUgIC0gcG9pbnRlciB0byBzYnIgZW52ZWxvcGUgaGFuZGxlCiAgICAgICAgICAgICAgYWxsb3dTcHJlYWQgICAtIGNvbW1hbmRsaW5lIHBhcmFtZXRlcgogICAgICAgICAgICAgIG51bUVudlN0YXRpYyAgLSBjb21tYW5kbGluZSBwYXJhbWV0ZXIKICAgICAgICAgICAgICBzdGF0aWNGcmFtaW5nIC0gY29tbWFuZGxpbmUgcGFyYW1ldGVyCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgIGhTYnJFbnZGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYWxsb3dTcHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUVudlN0YXRpYywKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdGltZVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmVxX3Jlc19maXhmaXgKICAgICAgICAgICAgICAgICAgICAgICAgICAsaW50IGxkR3JpZAogICAgICAgICAgICAgICAgICAgICAgICAgICkKCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkggMDAtMDYtMjYgKi8KCiAgRkRLbWVtY2xlYXIoaFNickVudkZyYW1lLHNpemVvZihTQlJfRU5WRUxPUEVfRlJBTUUgKSk7CgoKICAvKiBJbml0aWFsaXNhdGlvbiAqLwogIGhTYnJFbnZGcmFtZS0+ZnJhbWVDbGFzc09sZCA9IEZJWEZJWDsKICBoU2JyRW52RnJhbWUtPnNwcmVhZEZsYWcgPSAwOwoKICBoU2JyRW52RnJhbWUtPmFsbG93U3ByZWFkID0gYWxsb3dTcHJlYWQ7CiAgaFNickVudkZyYW1lLT5udW1FbnZTdGF0aWMgPSBudW1FbnZTdGF0aWM7CiAgaFNickVudkZyYW1lLT5zdGF0aWNGcmFtaW5nID0gc3RhdGljRnJhbWluZzsKICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeCA9IGZyZXFfcmVzX2ZpeGZpeDsKCiAgaFNickVudkZyYW1lLT5sZW5ndGhfdl9ib3JkID0gMDsKICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3cgPSAwOwoKICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2ZyZXEgPSAwOwogIGhTYnJFbnZGcmFtZS0+bGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IDA7CgogIGhTYnJFbnZGcmFtZS0+aV90cmFuRm9sbG93ID0gMDsKICBoU2JyRW52RnJhbWUtPmlfZmlsbEZvbGxvdyA9IDA7CgogIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5udW1iZXJUaW1lU2xvdHMgPSB0aW1lU2xvdHM7CgogIGlmIChsZEdyaWQpIHsKICAgIC8qY2FzZSBDT0RFQ19BQUNMRDoqLwogICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwogICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxNjsKICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF81MTJMRDsKICB9IGVsc2UKICBzd2l0Y2godGltZVNsb3RzKXsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKICAgICAgaFNickVudkZyYW1lLT5kbWluID0gNDsKICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTI7CiAgICAgIGhTYnJFbnZGcmFtZS0+U2JyR3JpZC5idWZmZXJGcmFtZVN0YXJ0ID0gMDsKICAgICAgaFNickVudkZyYW1lLT5mcmFtZU1pZGRsZVNsb3QgPSBGUkFNRV9NSURETEVfU0xPVF8xOTIwOwogICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzIwNDg6CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1pbiA9IDQ7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZG1heCA9IDEyOwogICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMjA0ODsKICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xMTUyOgogICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwogICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSA4OwogICAgICBoU2JyRW52RnJhbWUtPlNickdyaWQuYnVmZmVyRnJhbWVTdGFydCA9IDA7CiAgICAgIGhTYnJFbnZGcmFtZS0+ZnJhbWVNaWRkbGVTbG90ID0gRlJBTUVfTUlERExFX1NMT1RfMTE1MjsKICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMzA0OgogICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSA0OwogICAgICBoU2JyRW52RnJhbWUtPmRtYXggPSAxNTsKICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwogICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzIzMDQ7CiAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgfQoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVUcmFuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246ICBBZGQgbWFuZGF0b3J5IGJvcmRlcnMsIGFzIGRlc2NyaWJlZCBieSB0aGUgdHVuaW5nIHZlY3RvcgogICAgICAgICAgICAgICBhbmQgdGhlIGN1cnJlbnQgdHJhbnNpZW50IHBvc2l0aW9uCgogQXJndW1lbnRzOgogICAgICBtb2RpZmllZDoKICAgICAgICAgICAgICB2X2JvcmQgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9ib3JkIHZlY3RvcgogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQgLSBsZW5ndGggb2Ygdl9ib3JkIHZlY3RvcgogICAgICAgICAgICAgIHZfZnJlcSAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2ZyZXEgdmVjdG9yCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSAtIGxlbmd0aCBvZiB2X2ZyZXEgdmVjdG9yCiAgICAgICAgICAgICAgYm1pbiAgICAgICAgICAtIGludCBwb2ludGVyIHRvIGJtaW4gKGNhbGwgYnkgcmVmZXJlbmNlKQogICAgICAgICAgICAgIGJtYXggICAgICAgICAgLSBpbnQgcG9pbnRlciB0byBibWF4IChjYWxsIGJ5IHJlZmVyZW5jZSkKICAgICAgbm90IG1vZGlmaWVkOgogICAgICAgICAgICAgIHRyYW4gICAgICAgICAgLSBwb3NpdGlvbiBvZiB0cmFuc2llbnQKICAgICAgICAgICAgICB2X3R1bmluZ1NlZ20gIC0gaW50IHBvaW50ZXIgdG8gdl90dW5pbmdTZWdtIHZlY3RvcgogICAgICAgICAgICAgIHZfdHVuaW5nRnJlcSAgLSBpbnQgcG9pbnRlciB0byB2X3R1bmluZ0ZyZXEgdmVjdG9yCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmZpbGxGcmFtZVRyYW4gKGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCAgICAgIC8qITwgdHVuaW5nOiBkZXNpcmVkIHNlZ21lbnQgbGVuZ3RocyAqLwogICAgICAgICAgICAgICBjb25zdCBpbnQgKnZfdHVuaW5nRnJlcSwgICAgICAvKiE8IHR1bmluZzogZGVzaXJlZCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KICAgICAgICAgICAgICAgaW50IHRyYW4sICAgICAgICAgICAgICAgICAgICAgLyohPCBpbnB1dCA6IHBvc2l0aW9uIG9mIHRyYW5zaWVudCAqLwogICAgICAgICAgICAgICBpbnQgKnZfYm9yZCwgICAgICAgICAgICAgICAgICAvKiE8IG1lbU5ldzogYm9yZGVycyAqLwogICAgICAgICAgICAgICBpbnQgKmxlbmd0aF92X2JvcmQsICAgICAgICAgICAvKiE8IG1lbU5ldzogIyBib3JkZXJzICovCiAgICAgICAgICAgICAgIGludCAqdl9mcmVxLCAgICAgICAgICAgICAgICAgIC8qITwgbWVtTmV3OiBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgKi8KICAgICAgICAgICAgICAgaW50ICpsZW5ndGhfdl9mcmVxLCAgICAgICAgICAgLyohPCBtZW1OZXc6ICMgZnJlcXVlbmN5IHJlc29sdXRpb25zICovCiAgICAgICAgICAgICAgIGludCAqYm1pbiwgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBmaXJzdCBtYW5kYXRvcnkgYm9yZGVyICovCiAgICAgICAgICAgICAgIGludCAqYm1heCAgICAgICAgICAgICAgICAgICAgIC8qITwgaGxwTmV3OiBsYXN0ICBtYW5kYXRvcnkgYm9yZGVyICovCiAgICAgICAgICAgICAgICkKewogIGludCBib3JkLCBpOwoKICAqbGVuZ3RoX3ZfYm9yZCA9IDA7CiAgKmxlbmd0aF92X2ZyZXEgPSAwOwoKICAvKiBhZGQgYXR0YWNrIGVudiBsZWFkaW5nIGJvcmRlciAob3B0aW9uYWwpICovCiAgaWYgKHZfdHVuaW5nU2VnbVswXSkgewogICAgLyogdl9ib3JkID0gWyhCYSldIHN0YXJ0IG9mIGF0dGFjayBlbnYgKi8KICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCAodHJhbiAtIHZfdHVuaW5nU2VnbVswXSkpOwoKICAgIC8qIHZfZnJlcSA9IFsoRmEpXSByZXMgb2YgYXR0YWNrIGVudiAqLwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfdHVuaW5nRnJlcVswXSk7CiAgfQoKICAvKiBhZGQgYXR0YWNrIGVudiB0cmFpbGluZyBib3JkZXIvZmlyc3QgZGVjYXkgZW52IGxlYWRpbmcgYm9yZGVyICovCiAgYm9yZCA9IHRyYW47CiAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHRyYW4pOyAgIC8qIHZfYm9yZCA9IFsoQmEpLEJkMV0gKi8KCiAgLyogYWRkIGZpcnN0IGRlY2F5IGVudiB0cmFpbGluZyBib3JkZXIvMjpuZCBkZWNheSBlbnYgbGVhZGluZyBib3JkZXIgKi8KICBpZiAodl90dW5pbmdTZWdtWzFdKSB7CiAgICBib3JkICs9IHZfdHVuaW5nU2VnbVsxXTsKCiAgICAvKiB2X2JvcmQgPSBbKEJhKSxCZDEsQmQyXSAqLwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOwoKICAgIC8qIHZfZnJlcSA9IFsoRmEpLEZkMV0gKi8KICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X3R1bmluZ0ZyZXFbMV0pOwogIH0KCiAgLyogYWRkIDI6bmQgZGVjYXkgZW52IHRyYWlsaW5nIGJvcmRlciAob3B0aW9uYWwpICovCiAgaWYgKHZfdHVuaW5nU2VnbVsyXSAhPSAwKSB7CiAgICBib3JkICs9IHZfdHVuaW5nU2VnbVsyXTsKCiAgICAvKiB2X2JvcmQgPSBbKEJhKSxCZDEsIEJkMiwoQmQzKV0gKi8KICAgIEZES3NickVuY19BZGRSaWdodCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCBib3JkKTsKCiAgICAvKiB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMildICovCiAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl90dW5pbmdGcmVxWzJdKTsKICB9CgogIC8qICB2X2ZyZXEgPSBbKEZhKSxGZDEsKEZkMiksMV0gKi8KICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgMSk7CgoKICAvKiAgY2FsYyBtaW4gYW5kIG1heCB2YWx1ZXMgb2YgbWFuZGF0b3J5IGJvcmRlcnMgKi8KICAqYm1pbiA9IHZfYm9yZFswXTsKICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQ7IGkrKykKICAgIGlmICh2X2JvcmRbaV0gPCAqYm1pbikKICAgICAgKmJtaW4gPSB2X2JvcmRbaV07CgogICpibWF4ID0gdl9ib3JkWzBdOwogIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZDsgaSsrKQogICAgaWYgKHZfYm9yZFtpXSA+ICpibWF4KQogICAgICAqYm1heCA9IHZfYm9yZFtpXTsKCn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGZpbGxGcmFtZVByZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOiBBZGQgYm9yZGVycyBiZWZvcmUgbWFuZGF0b3J5IGJvcmRlcnMsIGlmIG5lZWRlZAoKIEFyZ3VtZW50czoKICAgICAgIG1vZGlmaWVkOgogICAgICAgICAgICAgIHZfYm9yZCAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZCAtIGxlbmd0aCBvZiB2X2JvcmQgdmVjdG9yCiAgICAgICAgICAgICAgdl9mcmVxICAgICAgICAtIGludCBwb2ludGVyIHRvIHZfZnJlcSB2ZWN0b3IKICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxIC0gbGVuZ3RoIG9mIHZfZnJlcSB2ZWN0b3IKICAgICAgIG5vdCBtb2RpZmllZDoKICAgICAgICAgICAgICBkbWF4ICAgICAgICAgIC0gaW50IHZhbHVlCiAgICAgICAgICAgICAgYm1pbiAgICAgICAgICAtIGludCB2YWx1ZQogICAgICAgICAgICAgIHJlc3QgICAgICAgICAgLSBpbnQgdmFsdWUKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZmlsbEZyYW1lUHJlIChJTlQgZG1heCwKICAgICAgICAgICAgICBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAogICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsCiAgICAgICAgICAgICAgSU5UIGJtaW4sIElOVCByZXN0KQp7CiAgLyoKICAgIGlucHV0IHN0YXRlOgogICAgdl9ib3JkID0gWyhCYSksQmQxLCBCZDIgLChCZDMpXQogICAgdl9mcmVxID0gWyhGYSksRmQxLChGZDIpLDEgXQogICovCgogIElOVCBwYXJ0cywgZCwgaiwgUywgcyA9IDAsIHNlZ20sIGJvcmQ7CgogIC8qCiAgICBzdGFydCB3aXRoIG9uZSBlbnZlbG9wZQogICovCgogIHBhcnRzID0gMTsKICBkID0gcmVzdDsKCiAgLyoKICAgIGNhbGMgIyBvZiBhZGRpdGlvbmFsIGVudmVsb3BlcyBhbmQgY29ycmVzcG9uZGluZyBsZW5ndGhzCiAgKi8KCiAgd2hpbGUgKGQgPiBkbWF4KSB7CiAgICBwYXJ0cysrOwoKICAgIHNlZ20gPSByZXN0IC8gcGFydHM7CiAgICBTID0gKHNlZ20gLSAyKT4+MTsKICAgIHMgPSBmaXhNaW4gKDgsIDIgKiBTICsgMik7CiAgICBkID0gcmVzdCAtIChwYXJ0cyAtIDEpICogczsKICB9CgogIC8qCiAgICBhZGQgYm9yZGVycyBiZWZvcmUgbWFuZGF0b3J5IGJvcmRlcnMKICAqLwoKICBib3JkID0gYm1pbjsKCiAgZm9yIChqID0gMDsgaiA8PSBwYXJ0cyAtIDI7IGorKykgewogICAgYm9yZCA9IGJvcmQgLSBzOwoKICAgIC8qIHZfYm9yZCA9IFsuLi4sKEJmKSwoQmEpLEJkMSwgQmQyICwoQmQzKV0gKi8KICAgIEZES3NickVuY19BZGRMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIGJvcmQpOwoKICAgIC8qIHZfZnJlcSA9IFsuLi4sKDEgKSwoRmEpLEZkMSwoRmQyKSwgMSAgIF0gKi8KICAgIEZES3NickVuY19BZGRMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmIE92ZXJsYXAgY29udHJvbAoKICBDYWxjdWxhdGUgbWF4IGxlbmd0aCBvZiB0cmFpbGluZyBmaWxsIHNlZ21lbnRzLCBzdWNoIHRoYXQgd2UgYWx3YXlzIGdldCBhCiAgYm9yZGVyIHdpdGhpbiB0aGUgZnJhbWUgb3ZlcmxhcCByZWdpb24KCiAgXHJldHVybiB2b2lkCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50CmNhbGNGaWxsTGVuZ3RoTWF4IChpbnQgdHJhblBvcywgICAgICAgICAgLyohPCBpbnB1dCA6IHRyYW5zaWVudCBwb3NpdGlvbiAocmVmOiB0cmFuIGRldCkgKi8KICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMgICAvKiE8IGlucHV0IDogbnVtYmVyIG9mIHRpbWVzbG90cyAqLwogICAgICAgICAgICAgICAgICAgKQp7CiAgaW50IGZtYXg7CgogIC8qCiAgICBjYWxjdWxhdGUgdHJhbnNpZW50IHBvc2l0aW9uIHdpdGhpbiBlbnZlbG9wZSBidWZmZXIKICAqLwogIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKQogIHsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjA0ODoKICAgICAgICBpZiAodHJhblBvcyA8IDQpCiAgICAgICAgICBmbWF4ID0gNjsKICAgICAgICBlbHNlIGlmICh0cmFuUG9zID09IDQgfHwgdHJhblBvcyA9PSA1KQogICAgICAgICAgZm1heCA9IDQ7CiAgICAgICAgZWxzZQogICAgICAgICAgZm1heCA9IDg7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgogICAgICAgIGlmICh0cmFuUG9zIDwgNCkKICAgICAgICAgIGZtYXggPSA1OwogICAgICAgIGVsc2UgaWYgKHRyYW5Qb3MgPT0gNCB8fCB0cmFuUG9zID09IDUpCiAgICAgICAgICBmbWF4ID0gMzsKICAgICAgICBlbHNlCiAgICAgICAgICBmbWF4ID0gNzsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIGZtYXggPSA4OwogICAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIGZtYXg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVQb3N0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246IC1BZGQgYm9yZGVycyBhZnRlciBtYW5kYXRvcnkgYm9yZGVycywgaWYgbmVlZGVkCiAgICAgICAgICAgICAgIE1ha2UgYSBwcmVsaW1pbmFyeSBkZXNpZ24gb2YgbmV4dCBmcmFtZSwKICAgICAgICAgICAgICAgYXNzdW1pbmcgbm8gdHJhbnNpZW50IGlzIHByZXNlbnQgdGhlcmUKCiBBcmd1bWVudHM6CiAgICAgICBtb2RpZmllZDoKICAgICAgICAgICAgICBwYXJ0cyAgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gcGFydHMgKGNhbGwgYnkgcmVmZXJlbmNlKQogICAgICAgICAgICAgIGQgICAgICAgICAgICAgLSBpbnQgcG9pbnRlciB0byBkIChjYWxsIGJ5IHJlZmVyZW5jZSkKICAgICAgICAgICAgICB2X2JvcmQgICAgICAgIC0gaW50IHBvaW50ZXIgdG8gdl9ib3JkIHZlY3RvcgogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQgLSBsZW5ndGggb2Ygdl9ib3JkIHZlY3RvcgogICAgICAgICAgICAgIHZfZnJlcSAgICAgICAgLSBpbnQgcG9pbnRlciB0byB2X2ZyZXEgdmVjdG9yCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfZnJlcSAtIGxlbmd0aCBvZiB2X2ZyZXEgdmVjdG9yCiAgICAgICAgbm90IG1vZGlmaWVkOgogICAgICAgICAgICAgIGJtYXggICAgICAgICAgLSBpbnQgdmFsdWUKICAgICAgICAgICAgICBkbWF4ICAgICAgICAgIC0gaW50IHZhbHVlCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmZpbGxGcmFtZVBvc3QgKElOVCAqcGFydHMsIElOVCAqZCwgSU5UIGRtYXgsIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCBibWF4LAogICAgICAgICAgICAgICBJTlQgYnVmZmVyRnJhbWVTdGFydCwgSU5UIG51bWJlclRpbWVTbG90cywgSU5UIGZtYXgpCnsKICBJTlQgaiwgcmVzdCwgc2VnbSwgUywgcyA9IDAsIGJvcmQ7CgogIC8qCiAgICBpbnB1dCBzdGF0ZToKICAgIHZfYm9yZCA9IFsuLi4sKEJmKSwoQmEpLEJkMSwgQmQyICwoQmQzKV0KICAgIHZfZnJlcSA9IFsuLi4sKDEgKSwoRmEpLEZkMSwoRmQyKSwxICAgIF0KICAqLwoKICByZXN0ID0gYnVmZmVyRnJhbWVTdGFydCArIDIgKiBudW1iZXJUaW1lU2xvdHMgLSBibWF4OwogICpkID0gcmVzdDsKCiAgaWYgKCpkID4gMCkgewogICAgKnBhcnRzID0gMTsgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggb25lIGVudmVsb3BlICovCgogICAgLyogY2FsYyAjIG9mIGFkZGl0aW9uYWwgZW52ZWxvcGVzIGFuZCBjb3JyZXNwb25kaW5nIGxlbmd0aHMgKi8KCiAgICB3aGlsZSAoKmQgPiBkbWF4KSB7CiAgICAgICpwYXJ0cyA9ICpwYXJ0cyArIDE7CgogICAgICBzZWdtID0gcmVzdCAvICgqcGFydHMpOwogICAgICBTID0gKHNlZ20gLSAyKT4+MTsKICAgICAgcyA9IGZpeE1pbiAoZm1heCwgMiAqIFMgKyAyKTsKICAgICAgKmQgPSByZXN0IC0gKCpwYXJ0cyAtIDEpICogczsKICAgIH0KCiAgICAvKiBhZGQgYm9yZGVycyBhZnRlciBtYW5kYXRvcnkgYm9yZGVycyAqLwoKICAgIGJvcmQgPSBibWF4OwogICAgZm9yIChqID0gMDsgaiA8PSAqcGFydHMgLSAyOyBqKyspIHsKICAgICAgYm9yZCArPSBzOwoKICAgICAgLyogdl9ib3JkID0gIFsuLi4sKEJmKSwoQmEpLEJkMSwgQmQyICwoQmQzKSwoQmYpXSAqLwogICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgYm9yZCk7CgogICAgICAvKiB2X2ZyZXEgPSAgWy4uLiwoMSApLChGYSksRmQxLChGZDIpLCAxICAgLCAxISAsMV0gKi8KICAgICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIDEpOwogICAgfQogIH0KICBlbHNlIHsKICAgICpwYXJ0cyA9IDE7CgogICAgLyogcmVtb3ZlIGxhc3QgZWxlbWVudCBmcm9tIHZfYm9yZCBhbmQgdl9mcmVxICovCgogICAgKmxlbmd0aF92X2JvcmQgPSAqbGVuZ3RoX3ZfYm9yZCAtIDE7CiAgICAqbGVuZ3RoX3ZfZnJlcSA9ICpsZW5ndGhfdl9mcmVxIC0gMTsKCiAgfQp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBmaWxsRnJhbWVJbnRlcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIERlc2NyaXB0aW9uOgoKIEFyZ3VtZW50czogICBuTCAgICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICB2X3R1bmluZ1NlZ20gICAgICAgIC0KICAgICAgICAgICAgICB2X2JvcmQgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkICAgICAgIC0KICAgICAgICAgICAgICBibWluICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICB2X2ZyZXEgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxICAgICAgIC0KICAgICAgICAgICAgICB2X2JvcmRGb2xsb3cgICAgICAgIC0KICAgICAgICAgICAgICBsZW5ndGhfdl9ib3JkRm9sbG93IC0KICAgICAgICAgICAgICB2X2ZyZXFGb2xsb3cgICAgICAgIC0KICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93IC0KICAgICAgICAgICAgICBpX2ZpbGxGb2xsb3cgICAgICAgIC0KICAgICAgICAgICAgICBkbWluICAgICAgICAgICAgICAgIC0KICAgICAgICAgICAgICBkbWF4ICAgICAgICAgICAgICAgIC0KCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZmlsbEZyYW1lSW50ZXIgKElOVCAqbkwsIGNvbnN0IGludCAqdl90dW5pbmdTZWdtLCBJTlQgKnZfYm9yZCwgSU5UICpsZW5ndGhfdl9ib3JkLAogICAgICAgICAgICAgICAgSU5UIGJtaW4sIElOVCAqdl9mcmVxLCBJTlQgKmxlbmd0aF92X2ZyZXEsIElOVCAqdl9ib3JkRm9sbG93LAogICAgICAgICAgICAgICAgSU5UICpsZW5ndGhfdl9ib3JkRm9sbG93LCBJTlQgKnZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywgSU5UIGlfZmlsbEZvbGxvdywgSU5UIGRtaW4sCiAgICAgICAgICAgICAgICBJTlQgZG1heCwgSU5UIG51bWJlclRpbWVTbG90cykKewogIElOVCBtaWRkbGUsIGJfbmV3LCBudW1Cb3JkRm9sbG93LCBib3JkTWF4Rm9sbG93LCBpOwoKICBpZiAobnVtYmVyVGltZVNsb3RzICE9IE5VTUJFUl9USU1FX1NMT1RTXzExNTIpIHsKCiAgICAvKiAlIHJlbW92ZSBmaWxsIGJvcmRlcnM6ICovCiAgICBpZiAoaV9maWxsRm9sbG93ID49IDEpIHsKICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSBpX2ZpbGxGb2xsb3c7CiAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gaV9maWxsRm9sbG93OwogICAgfQoKICAgIG51bUJvcmRGb2xsb3cgPSAqbGVuZ3RoX3ZfYm9yZEZvbGxvdzsKICAgIGJvcmRNYXhGb2xsb3cgPSB2X2JvcmRGb2xsb3dbbnVtQm9yZEZvbGxvdyAtIDFdOwoKICAgIC8qIHJlbW92ZSBldmVuIG1vcmUgYm9yZGVycyBpZiBuZWVkZWQgKi8KICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OwogICAgd2hpbGUgKG1pZGRsZSA8IDApIHsKICAgICAgbnVtQm9yZEZvbGxvdy0tOwogICAgICBib3JkTWF4Rm9sbG93ID0gdl9ib3JkRm9sbG93W251bUJvcmRGb2xsb3cgLSAxXTsKICAgICAgbWlkZGxlID0gYm1pbiAtIGJvcmRNYXhGb2xsb3c7CiAgICB9CgogICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSBudW1Cb3JkRm9sbG93OwogICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cgPSBudW1Cb3JkRm9sbG93OwogICAgKm5MID0gbnVtQm9yZEZvbGxvdyAtIDE7CgogICAgYl9uZXcgPSAqbGVuZ3RoX3ZfYm9yZDsKCgogICAgaWYgKG1pZGRsZSA8PSBkbWF4KSB7CiAgICAgIGlmIChtaWRkbGUgPj0gZG1pbikgeyAgICAgICAvKiBjb25jYXRlbmF0ZSAqLwogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwogICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgICB9CgogICAgICBlbHNlIHsKICAgICAgICBpZiAodl90dW5pbmdTZWdtWzBdICE9IDApIHsgICAgICAgLyogcmVtb3ZlIG9uZSBuZXcgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CiAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwoKICAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwogICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSArIDEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgaWYgKCpsZW5ndGhfdl9ib3JkRm9sbG93ID4gMSkgeyAvKiByZW1vdmUgb25lIG9sZCBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCiAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywKICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CiAgICAgICAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CgogICAgICAgICAgICAqbkwgPSAqbkwgLSAxOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIG5ldyAidHJhbnNpZW50IiBib3JkZXIgYW5kIGNvbmNhdGVuYXRlICovCgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmxlbmd0aF92X2JvcmQgLSAxOyBpKyspCiAgICAgICAgICAgICAgdl9ib3JkW2ldID0gdl9ib3JkW2kgKyAxXTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKICAgICAgICAgICAgICB2X2ZyZXFbaV0gPSB2X2ZyZXFbaSArIDFdOwoKICAgICAgICAgICAgKmxlbmd0aF92X2JvcmQgPSBiX25ldyAtIDE7CiAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwoKICAgICAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LAogICAgICAgICAgICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwogICAgICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCiAgICAgICAgICAgICAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaWRkbGUgPiBkbWF4ICovCgogICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAogICAgICAgICAgbWlkZGxlKTsKICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgfQoKCiAgfQogIGVsc2UgeyAvKiBudW1iZXJUaW1lU2xvdHM9PU5VTUJFUl9USU1FX1NMT1RTXzExNTIgKi8KCiAgICBJTlQgbCxtOwoKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICByZW1vdmUgZmlsbCBib3JkZXJzCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBpZiAoaV9maWxsRm9sbG93ID49IDEpIHsKICAgICAgKmxlbmd0aF92X2JvcmRGb2xsb3cgPSBpX2ZpbGxGb2xsb3c7CiAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93ID0gaV9maWxsRm9sbG93OwogICAgfQoKICAgIG51bUJvcmRGb2xsb3cgPSAqbGVuZ3RoX3ZfYm9yZEZvbGxvdzsKICAgIGJvcmRNYXhGb2xsb3cgPSB2X2JvcmRGb2xsb3dbbnVtQm9yZEZvbGxvdyAtIDFdOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIHJlbW92ZSBtb3JlIGJvcmRlcnMgaWYgbmVjZXNzYXJ5IHRvIGVsaW1pbmF0ZSBvdmVybGFwCiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLyogY2hlY2sgZm9yIG92ZXJsYXAgKi8KICAgIG1pZGRsZSA9IGJtaW4gLSBib3JkTWF4Rm9sbG93OwoKICAgIC8qIGludGVydmFsczoKICAgICAgIGkpICAgICAgICAgICAgIG1pZGRsZSA8ICAwICAgICA6IG92ZXJsYXAsIG11c3QgcmVtb3ZlIGJvcmRlcnMKICAgICAgIGlpKSAgICAgICAwIDw9IG1pZGRsZSA8ICBkbWluICA6IG5vIG92ZXJsYXAgYnV0IHRvbyB0aWdodCwgbXVzdCByZW1vdmUgYm9yZGVycwogICAgICAgaWlpKSAgIGRtaW4gPD0gbWlkZGxlIDw9IGRtYXggIDogb2ssIGp1c3QgY29uY2F0ZW5hdGUKICAgICAgIGl2KSAgICBkbWF4IDw9IG1pZGRsZSAgICAgICAgICA6IHRvbyB3aWRlLCBtdXN0IGFkZCBib3JkZXJzCiAgICAgKi8KCiAgICAvKiBmaXJzdCByZW1vdmUgb2xkIG5vbi1maWxsLWJvcmRlcnMuLi4gKi8KICAgIHdoaWxlIChtaWRkbGUgPCAwKSB7CgogICAgICAvKiAuLi5idXQgZG9uJ3QgcmVtb3ZlIGFsbCBvZiB0aGVtICovCiAgICAgIGlmIChudW1Cb3JkRm9sbG93ID09IDEpCiAgICAgICAgYnJlYWs7CgogICAgICBudW1Cb3JkRm9sbG93LS07CiAgICAgIGJvcmRNYXhGb2xsb3cgPSB2X2JvcmRGb2xsb3dbbnVtQm9yZEZvbGxvdyAtIDFdOwogICAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKICAgIH0KCiAgICAvKiBpZiB0aGlzIGlzbid0IGVub3VnaCwgcmVtb3ZlIG5ldyBub24tZmlsbCBib3JkZXJzICovCiAgICBpZiAobWlkZGxlIDwgMCkKICAgIHsKICAgICAgZm9yIChsID0gMCwgbSA9IDAgOyBsIDwgKmxlbmd0aF92X2JvcmQgOyBsKyspCiAgICAgIHsKICAgICAgICBpZih2X2JvcmRbbF0+IGJvcmRNYXhGb2xsb3cpCiAgICAgICAgewogICAgICAgICAgdl9ib3JkW21dID0gdl9ib3JkW2xdOwogICAgICAgICAgdl9mcmVxW21dID0gdl9mcmVxW2xdOwogICAgICAgICAgbSsrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgKmxlbmd0aF92X2JvcmQgPSBsOwogICAgICAqbGVuZ3RoX3ZfZnJlcSA9IGw7CgogICAgICBibWluID0gdl9ib3JkWzBdOwoKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB1cGRhdGUgbW9kaWZpZWQgZm9sbG93LXVwIGRhdGEKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CiAgICAqbGVuZ3RoX3ZfZnJlcUZvbGxvdyA9IG51bUJvcmRGb2xsb3c7CgogICAgLyogbGVmdCByZWxhdGl2ZSBib3JkZXJzIGNvcnJlc3BvbmQgdG8gZm9sbG93LXVwICovCiAgICAqbkwgPSBudW1Cb3JkRm9sbG93IC0gMTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB0YWtlIGNhcmUgb2YgaW50ZXJ2YWxzIGlpIHRocm91Z2ggaXYKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvKiBub3cgbWlkZGxlIHNob3VsZCBiZSA+PSAwICovCiAgICBtaWRkbGUgPSBibWluIC0gYm9yZE1heEZvbGxvdzsKCiAgICBpZiAobWlkZGxlIDw9IGRtaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaWkpICovCiAgICB7CiAgICAgIGJfbmV3ID0gKmxlbmd0aF92X2JvcmQ7CgogICAgICBpZiAodl90dW5pbmdTZWdtWzBdICE9IDApCiAgICAgIHsKICAgICAgICAvKiByZW1vdmUgbmV3ICJsdXh1cnkiIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KICAgICAgICAqbGVuZ3RoX3ZfYm9yZCA9IGJfbmV3IC0gMTsKICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKCiAgICAgICAgKmxlbmd0aF92X2ZyZXEgPSBiX25ldyAtIDE7CiAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSArIDEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywKICAgICAgICAgICAgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwoKICAgICAgfQogICAgICBlbHNlIGlmICgqbGVuZ3RoX3ZfYm9yZEZvbGxvdyA+IDEpCiAgICAgIHsKICAgICAgICAvKiByZW1vdmUgb2xkIGJvcmRlciBhbmQgY29uY2F0ZW5hdGUgKi8KICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93IC0gMSk7CiAgICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfZnJlcSwgbGVuZ3RoX3ZfZnJlcSwgdl9mcmVxRm9sbG93LAogICAgICAgICAgICAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyAtIDEpOwoKICAgICAgICAqbkwgPSAqbkwgLSAxOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIHJlbW92ZSBuZXcgYm9yZGVyIGFuZCBjb25jYXRlbmF0ZSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZCAtIDE7IGkrKykKICAgICAgICAgIHZfYm9yZFtpXSA9IHZfYm9yZFtpICsgMV07CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfZnJlcSAtIDE7IGkrKykKICAgICAgICAgIHZfZnJlcVtpXSA9IHZfZnJlcVtpICsgMV07CgogICAgICAgICpsZW5ndGhfdl9ib3JkID0gYl9uZXcgLSAxOwogICAgICAgICpsZW5ndGhfdl9mcmVxID0gYl9uZXcgLSAxOwoKICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9ib3JkLCBsZW5ndGhfdl9ib3JkLCB2X2JvcmRGb2xsb3csCiAgICAgICAgICAgICpsZW5ndGhfdl9ib3JkRm9sbG93KTsKICAgICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csCiAgICAgICAgICAgICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoKG1pZGRsZSA+PSBkbWluKSAmJiAobWlkZGxlIDw9IGRtYXgpKSAgICAgIC8qIChpaWkpICovCiAgICB7CiAgICAgIC8qIGNvbmNhdGVuYXRlICovCiAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZEZvbGxvdywgKmxlbmd0aF92X2JvcmRGb2xsb3cpOwogICAgICBGREtzYnJFbmNfQWRkVmVjTGVmdCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCB2X2ZyZXFGb2xsb3csICpsZW5ndGhfdl9mcmVxRm9sbG93KTsKCiAgICB9CiAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGl2KSAqLwogICAgewogICAgICBmaWxsRnJhbWVQcmUgKGRtYXgsIHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9mcmVxLCBsZW5ndGhfdl9mcmVxLCBibWluLAogICAgICAgICAgbWlkZGxlKTsKICAgICAgRkRLc2JyRW5jX0FkZFZlY0xlZnQgKHZfYm9yZCwgbGVuZ3RoX3ZfYm9yZCwgdl9ib3JkRm9sbG93LCAqbGVuZ3RoX3ZfYm9yZEZvbGxvdyk7CiAgICAgIEZES3NickVuY19BZGRWZWNMZWZ0ICh2X2ZyZXEsIGxlbmd0aF92X2ZyZXEsIHZfZnJlcUZvbGxvdywgKmxlbmd0aF92X2ZyZXFGb2xsb3cpOwogICAgfQogIH0KfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgY2FsY0ZyYW1lQ2xhc3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICBJTlQqIGZyYW1lQ2xhc3MsIElOVCogZnJhbWVDbGFzc09sZCwgSU5UIHRyYW5GbGFnLCBJTlQqIHNwcmVhZEZsYWcpCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNhbGNGcmFtZUNsYXNzIChGUkFNRV9DTEFTUyAqZnJhbWVDbGFzcywgRlJBTUVfQ0xBU1MgKmZyYW1lQ2xhc3NPbGQsIElOVCB0cmFuRmxhZywKICAgICAgICAgICAgICAgIElOVCAqc3ByZWFkRmxhZykKewoKICBzd2l0Y2ggKCpmcmFtZUNsYXNzT2xkKSB7CiAgY2FzZSBGSVhGSVhvbmx5OgogIGNhc2UgRklYRklYOgogICAgaWYgKHRyYW5GbGFnKSAgKmZyYW1lQ2xhc3MgPSBGSVhWQVI7CiAgICBlbHNlICAgICAgICAgICAqZnJhbWVDbGFzcyA9IEZJWEZJWDsKICAgIGJyZWFrOwogIGNhc2UgRklYVkFSOgogICAgaWYgKHRyYW5GbGFnKSB7ICpmcmFtZUNsYXNzID0gVkFSVkFSOyAqc3ByZWFkRmxhZyA9IDA7IH0KICAgIGVsc2UgewogICAgICBpZiAoKnNwcmVhZEZsYWcpICAqZnJhbWVDbGFzcyA9IFZBUlZBUjsKICAgICAgZWxzZSAgICAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBWQVJGSVg7CiAgICB9CiAgICBicmVhazsKICBjYXNlIFZBUkZJWDoKICAgIGlmICh0cmFuRmxhZykgICpmcmFtZUNsYXNzID0gRklYVkFSOwogICAgZWxzZSAgICAgICAgICAgKmZyYW1lQ2xhc3MgPSBGSVhGSVg7CiAgICBicmVhazsKICBjYXNlIFZBUlZBUjoKICAgIGlmICh0cmFuRmxhZykgeyAqZnJhbWVDbGFzcyA9IFZBUlZBUjsgKnNwcmVhZEZsYWcgPSAwOyB9CiAgICBlbHNlIHsKICAgICAgaWYgKCpzcHJlYWRGbGFnKSAgKmZyYW1lQ2xhc3MgPSBWQVJWQVI7CiAgICAgIGVsc2UgICAgICAgICAgICAgICpmcmFtZUNsYXNzID0gVkFSRklYOwogICAgfQogICAgYnJlYWs7CiAgfTsKCiAgKmZyYW1lQ2xhc3NPbGQgPSAqZnJhbWVDbGFzczsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgc3BlY2lhbENhc2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjoKCiBBcmd1bWVudHM6ICAgc3ByZWFkRmxhZwogICAgICAgICAgICAgIGFsbG93U3ByZWFkCiAgICAgICAgICAgICAgdl9ib3JkCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAogICAgICAgICAgICAgIHZfZnJlcQogICAgICAgICAgICAgIGxlbmd0aF92X2ZyZXEKICAgICAgICAgICAgICBwYXJ0cwogICAgICAgICAgICAgIGQKCiBSZXR1cm46ICAgICAgbm9uZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKc3BlY2lhbENhc2UgKElOVCAqc3ByZWFkRmxhZywgSU5UIGFsbG93U3ByZWFkLCBJTlQgKnZfYm9yZCwKICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCAqbGVuZ3RoX3ZfZnJlcSwgSU5UICpwYXJ0cywKICAgICAgICAgICAgIElOVCBkKQp7CiAgSU5UIEw7CgogIEwgPSAqbGVuZ3RoX3ZfYm9yZDsKCiAgaWYgKGFsbG93U3ByZWFkKSB7ICAgICAgICAgICAgLyogYWRkIG9uZSAic3RlcCA4IiAqLwogICAgKnNwcmVhZEZsYWcgPSAxOwogICAgRkRLc2JyRW5jX0FkZFJpZ2h0ICh2X2JvcmQsIGxlbmd0aF92X2JvcmQsIHZfYm9yZFtMIC0gMV0gKyA4KTsKICAgIEZES3NickVuY19BZGRSaWdodCAodl9mcmVxLCBsZW5ndGhfdl9mcmVxLCAxKTsKICAgICgqcGFydHMpKys7CiAgfQogIGVsc2UgewogICAgaWYgKGQgPT0gMSkgeyAgICAgICAgICAgICAgIC8qICBzdHJldGNoIG9uZSBzbG90ICovCiAgICAgICpsZW5ndGhfdl9ib3JkID0gTCAtIDE7CiAgICAgICpsZW5ndGhfdl9mcmVxID0gTCAtIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKCh2X2JvcmRbTCAtIDFdIC0gdl9ib3JkW0wgLSAyXSkgPiAyKSB7ICAgICAgICAvKiBjb21wcmVzcyBvbmUgcXVhbnQgc3RlcCAqLwogICAgICAgIHZfYm9yZFtMIC0gMV0gPSB2X2JvcmRbTCAtIDFdIC0gMjsKICAgICAgICB2X2ZyZXFbKmxlbmd0aF92X2ZyZXEgLSAxXSA9IDA7IC8qIHVzZSBsb3cgcmVzIGZvciBzaG9ydCBzZWdtZW50ICovCiAgICAgIH0KICAgIH0KICB9Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGNhbGNDbW9uQm9yZGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgIGlfY21vbgogICAgICAgICAgICAgIGlfdHJhbgogICAgICAgICAgICAgIHZfYm9yZAogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQKICAgICAgICAgICAgICB0cmFuCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNhbGNDbW9uQm9yZGVyIChJTlQgKmlfY21vbiwgSU5UICppX3RyYW4sIElOVCAqdl9ib3JkLCBJTlQgKmxlbmd0aF92X2JvcmQsCiAgICAgICAgICAgICAgICBJTlQgdHJhbiwgSU5UIGJ1ZmZlckZyYW1lU3RhcnQsIElOVCBudW1iZXJUaW1lU2xvdHMpCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkggMDAtMDYtMjYgKi8KICBJTlQgaTsKCiAgZm9yIChpID0gMDsgaSA8ICpsZW5ndGhfdl9ib3JkOyBpKyspCiAgICBpZiAodl9ib3JkW2ldID49IGJ1ZmZlckZyYW1lU3RhcnQgKyBudW1iZXJUaW1lU2xvdHMpIHsgICAgICAvKiBGSCAwMC0wNi0yNiAqLwogICAgICAqaV9jbW9uID0gaTsKICAgICAgYnJlYWs7CiAgICB9CgogIC8qIGtlZXAgdHJhY2sgb2YgdHJhbnNpZW50OiAqLwogIGZvciAoaSA9IDA7IGkgPCAqbGVuZ3RoX3ZfYm9yZDsgaSsrKQogICAgaWYgKHZfYm9yZFtpXSA+PSB0cmFuKSB7CiAgICAgICppX3RyYW4gPSBpOwogICAgICBicmVhazsKICAgIH0KICAgIGVsc2UKICAgICAgKmlfdHJhbiA9IEVNUFRZOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAga2VlcEZvckZvbGxvd1VwCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgIHZfYm9yZEZvbGxvdwogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmRGb2xsb3cKICAgICAgICAgICAgICB2X2ZyZXFGb2xsb3cKICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxRm9sbG93CiAgICAgICAgICAgICAgaV90cmFuRm9sbG93CiAgICAgICAgICAgICAgaV9maWxsRm9sbG93CiAgICAgICAgICAgICAgdl9ib3JkCiAgICAgICAgICAgICAgbGVuZ3RoX3ZfYm9yZAogICAgICAgICAgICAgIHZfZnJlcQogICAgICAgICAgICAgIGlfY21vbgogICAgICAgICAgICAgIGlfdHJhbgogICAgICAgICAgICAgIHBhcnRzKQoKIFJldHVybjogICAgICBub25lCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZAprZWVwRm9yRm9sbG93VXAgKElOVCAqdl9ib3JkRm9sbG93LCBJTlQgKmxlbmd0aF92X2JvcmRGb2xsb3csCiAgICAgICAgICAgICAgICAgSU5UICp2X2ZyZXFGb2xsb3csIElOVCAqbGVuZ3RoX3ZfZnJlcUZvbGxvdywKICAgICAgICAgICAgICAgICBJTlQgKmlfdHJhbkZvbGxvdywgSU5UICppX2ZpbGxGb2xsb3csIElOVCAqdl9ib3JkLAogICAgICAgICAgICAgICAgIElOVCAqbGVuZ3RoX3ZfYm9yZCwgSU5UICp2X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sCiAgICAgICAgICAgICAgICAgSU5UIHBhcnRzLCBJTlQgbnVtYmVyVGltZVNsb3RzKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAgSU5UIEwsIGksIGo7CgogIEwgPSAqbGVuZ3RoX3ZfYm9yZDsKCiAgKCpsZW5ndGhfdl9ib3JkRm9sbG93KSA9IDA7CiAgKCpsZW5ndGhfdl9mcmVxRm9sbG93KSA9IDA7CgogIGZvciAoaiA9IDAsIGkgPSBpX2Ntb247IGkgPCBMOyBpKyssIGorKykgewogICAgdl9ib3JkRm9sbG93W2pdID0gdl9ib3JkW2ldIC0gbnVtYmVyVGltZVNsb3RzOyAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAgICB2X2ZyZXFGb2xsb3dbal0gPSB2X2ZyZXFbaV07CiAgICAoKmxlbmd0aF92X2JvcmRGb2xsb3cpKys7CiAgICAoKmxlbmd0aF92X2ZyZXFGb2xsb3cpKys7CiAgfQogIGlmIChpX3RyYW4gIT0gRU1QVFkpCiAgICAqaV90cmFuRm9sbG93ID0gaV90cmFuIC0gaV9jbW9uOwogIGVsc2UKICAgICppX3RyYW5Gb2xsb3cgPSBFTVBUWTsKICAqaV9maWxsRm9sbG93ID0gTCAtIChwYXJ0cyAtIDEpIC0gaV9jbW9uOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9ubmFtZTogIGNhbGNDdHJsU2lnbmFsCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogRGVzY3JpcHRpb246CgogQXJndW1lbnRzOiAgIGhTYnJHcmlkCiAgICAgICAgICAgICAgZnJhbWVDbGFzcwogICAgICAgICAgICAgIHZfYm9yZAogICAgICAgICAgICAgIGxlbmd0aF92X2JvcmQKICAgICAgICAgICAgICB2X2ZyZXEKICAgICAgICAgICAgICBsZW5ndGhfdl9mcmVxCiAgICAgICAgICAgICAgaV9jbW9uCiAgICAgICAgICAgICAgaV90cmFuCiAgICAgICAgICAgICAgc3ByZWFkRmxhZwogICAgICAgICAgICAgIG5MCgogUmV0dXJuOiAgICAgIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCmNhbGNDdHJsU2lnbmFsIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCiAgICAgICAgICAgICAgICBGUkFNRV9DTEFTUyBmcmFtZUNsYXNzLCBJTlQgKnZfYm9yZCwgSU5UIGxlbmd0aF92X2JvcmQsIElOVCAqdl9mcmVxLAogICAgICAgICAgICAgICAgSU5UIGxlbmd0aF92X2ZyZXEsIElOVCBpX2Ntb24sIElOVCBpX3RyYW4sIElOVCBzcHJlYWRGbGFnLAogICAgICAgICAgICAgICAgSU5UIG5MKQp7CgoKICBJTlQgaSwgciwgYSwgbiwgcCwgYiwgYUwsIGFSLCBudG90LCBubWF4LCBuUjsKCiAgSU5UICp2X2YgPSBoU2JyR3JpZC0+dl9mOwogIElOVCAqdl9mTFIgPSBoU2JyR3JpZC0+dl9mTFI7CiAgSU5UICp2X3IgPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmQ7CiAgSU5UICp2X3JMID0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzA7CiAgSU5UICp2X3JSID0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzE7CgogIElOVCBsZW5ndGhfdl9yID0gMDsKICBJTlQgbGVuZ3RoX3ZfclIgPSAwOwogIElOVCBsZW5ndGhfdl9yTCA9IDA7CgogIHN3aXRjaCAoZnJhbWVDbGFzcykgewogIGNhc2UgRklYVkFSOgogICAgLyogYWJzb2x1dGUgYm9yZGVyOiAqLwoKICAgIGEgPSB2X2JvcmRbaV9jbW9uXTsKCiAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwogICAgbGVuZ3RoX3ZfciA9IDA7CiAgICBpID0gaV9jbW9uOwoKICAgIHdoaWxlIChpID49IDEpIHsKICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CiAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yLCAmbGVuZ3RoX3Zfciwgcik7CiAgICAgIGktLTsKICAgIH0KCgogICAgLyogIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAqLwogICAgbiA9IGxlbmd0aF92X3I7CgoKICAgIC8qIGZyZXEgcmVzOiAqLwogICAgZm9yIChpID0gMDsgaSA8IGlfY21vbjsgaSsrKQogICAgICB2X2ZbaV0gPSB2X2ZyZXFbaV9jbW9uIC0gMSAtIGldOwogICAgdl9mW2lfY21vbl0gPSAxOwoKICAgIC8qIHBvaW50ZXI6ICovCiAgICBwID0gKGlfY21vbiA+PSBpX3RyYW4gJiYgaV90cmFuICE9IEVNUFRZKSA/IChpX2Ntb24gLSBpX3RyYW4gKyAxKSA6ICgwKSA7CgogICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwogICAgaFNickdyaWQtPmJzX2Fic19ib3JkID0gYTsKICAgIGhTYnJHcmlkLT5uID0gbjsKICAgIGhTYnJHcmlkLT5wID0gcDsKCiAgICBicmVhazsKICBjYXNlIFZBUkZJWDoKICAgIC8qIGFic29sdXRlIGJvcmRlcjogKi8KICAgIGEgPSB2X2JvcmRbMF07CgogICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KICAgIGxlbmd0aF92X3IgPSAwOwoKICAgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGhfdl9ib3JkOyBpKyspIHsKICAgICAgciA9IHZfYm9yZFtpXSAtIHZfYm9yZFtpIC0gMV07CiAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yLCAmbGVuZ3RoX3Zfciwgcik7CiAgICB9CgogICAgLyogbnVtYmVyIG9mIHJlbGF0aXZlIGJvcmRlcnM6ICovCiAgICBuID0gbGVuZ3RoX3ZfcjsKCiAgICAvKiBmcmVxIHJlczogKi8KICAgIEZES21lbWNweSAodl9mLCB2X2ZyZXEsIGxlbmd0aF92X2ZyZXEgKiBzaXplb2YgKElOVCkpOwoKCiAgICAvKiBwb2ludGVyOiAqLwogICAgcCA9IChpX3RyYW4gPj0gMCAmJiBpX3RyYW4gIT0gRU1QVFkpID8gKGlfdHJhbiArIDEpIDogKDApIDsKCiAgICBoU2JyR3JpZC0+ZnJhbWVDbGFzcyA9IGZyYW1lQ2xhc3M7CiAgICBoU2JyR3JpZC0+YnNfYWJzX2JvcmQgPSBhOwogICAgaFNickdyaWQtPm4gPSBuOwogICAgaFNickdyaWQtPnAgPSBwOwoKICAgIGJyZWFrOwogIGNhc2UgVkFSVkFSOgogICAgaWYgKHNwcmVhZEZsYWcpIHsKICAgICAgLyogYWJzb2x1dGUgYm9yZGVyczogKi8KICAgICAgYiA9IGxlbmd0aF92X2JvcmQ7CgogICAgICBhTCA9IHZfYm9yZFswXTsKICAgICAgYVIgPSB2X2JvcmRbYiAtIDFdOwoKCiAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAgICAqLwogICAgICBudG90ID0gYiAtIDI7CgogICAgICBubWF4ID0gMjsgICAgICAgICAgICAgICAgIC8qIG46IHswLDEsMn0gKi8KICAgICAgaWYgKG50b3QgPiBubWF4KSB7CiAgICAgICAgbkwgPSBubWF4OwogICAgICAgIG5SID0gbnRvdCAtIG5tYXg7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgbkwgPSBudG90OwogICAgICAgIG5SID0gMDsKICAgICAgfQoKICAgICAgLyogcmVsYXRpdmUgYm9yZGVyczogKi8KICAgICAgbGVuZ3RoX3ZfckwgPSAwOwogICAgICBmb3IgKGkgPSAxOyBpIDw9IG5MOyBpKyspIHsKICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfckwsICZsZW5ndGhfdl9yTCwgcik7CiAgICAgIH0KCiAgICAgIGxlbmd0aF92X3JSID0gMDsKICAgICAgaSA9IGIgLSAxOwogICAgICB3aGlsZSAoaSA+PSBiIC0gblIpIHsKICAgICAgICByID0gdl9ib3JkW2ldIC0gdl9ib3JkW2kgLSAxXTsKICAgICAgICBGREtzYnJFbmNfQWRkUmlnaHQgKHZfclIsICZsZW5ndGhfdl9yUiwgcik7CiAgICAgICAgaS0tOwogICAgICB9CgogICAgICAvKiBwb2ludGVyIChvbmx5IG9uZSBkdWUgdG8gY29uc3RyYWludCBpbiBmcmFtZSBpbmZvKTogKi8KICAgICAgcCA9IChpX3RyYW4gPiAwICYmIGlfdHJhbiAhPSBFTVBUWSkgPyAoYiAtIGlfdHJhbikgOiAoMCkgOwoKICAgICAgLyogZnJlcSByZXM6ICovCgogICAgICBmb3IgKGkgPSAwOyBpIDwgYiAtIDE7IGkrKykKICAgICAgICB2X2ZMUltpXSA9IHZfZnJlcVtpXTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgbGVuZ3RoX3ZfYm9yZCA9IGlfY21vbiArIDE7CiAgICAgIGxlbmd0aF92X2ZyZXEgPSBpX2Ntb24gKyAxOwoKCiAgICAgIC8qIGFic29sdXRlIGJvcmRlcnM6ICovCiAgICAgIGIgPSBsZW5ndGhfdl9ib3JkOwoKICAgICAgYUwgPSB2X2JvcmRbMF07CiAgICAgIGFSID0gdl9ib3JkW2IgLSAxXTsKCiAgICAgIC8qIG51bWJlciBvZiByZWxhdGl2ZSBib3JkZXJzOiAgICovCiAgICAgIG50b3QgPSBiIC0gMjsKICAgICAgblIgPSBudG90IC0gbkw7CgogICAgICAvKiByZWxhdGl2ZSBib3JkZXJzOiAqLwogICAgICBsZW5ndGhfdl9yTCA9IDA7CiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbkw7IGkrKykgewogICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwogICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yTCwgJmxlbmd0aF92X3JMLCByKTsKICAgICAgfQoKICAgICAgbGVuZ3RoX3ZfclIgPSAwOwogICAgICBpID0gYiAtIDE7CiAgICAgIHdoaWxlIChpID49IGIgLSBuUikgewogICAgICAgIHIgPSB2X2JvcmRbaV0gLSB2X2JvcmRbaSAtIDFdOwogICAgICAgIEZES3NickVuY19BZGRSaWdodCAodl9yUiwgJmxlbmd0aF92X3JSLCByKTsKICAgICAgICBpLS07CiAgICAgIH0KCiAgICAgIC8qIHBvaW50ZXIgKG9ubHkgb25lIGR1ZSB0byBjb25zdHJhaW50IGluIGZyYW1lIGluZm8pOiAqLwogICAgICBwID0gKGlfY21vbiA+PSBpX3RyYW4gJiYgaV90cmFuICE9IEVNUFRZKSA/IChpX2Ntb24gLSBpX3RyYW4gKyAxKSA6ICgwKSA7CgogICAgICAvKiBmcmVxIHJlczogKi8KICAgICAgZm9yIChpID0gMDsgaSA8IGIgLSAxOyBpKyspCiAgICAgICAgdl9mTFJbaV0gPSB2X2ZyZXFbaV07CiAgICB9CgogICAgaFNickdyaWQtPmZyYW1lQ2xhc3MgPSBmcmFtZUNsYXNzOwogICAgaFNickdyaWQtPmJzX2Fic19ib3JkXzAgPSBhTDsKICAgIGhTYnJHcmlkLT5ic19hYnNfYm9yZF8xID0gYVI7CiAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wID0gbkw7CiAgICBoU2JyR3JpZC0+YnNfbnVtX3JlbF8xID0gblI7CiAgICBoU2JyR3JpZC0+cCA9IHA7CgogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAvKiBkbyBub3RoaW5nICovCiAgICBicmVhazsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBGdW5jdGlvbm5hbWU6ICBjcmVhdGVEZWZGcmFtZUluZm8KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogQ29waWVzIHRoZSBkZWZhdWx0IChzdGF0aWMpIGZyYW1lSW5mbyBzdHJ1Y3RzIHRvIHRoZSBmcmFtZUluZm8KICAgICAgICAgICAgICBwYXNzZWQgYnkgcmVmZXJlbmNlOyBvbmx5IHVzZWQgZm9yIEZJWEZJWCBmcmFtZXMKCiBBcmd1bWVudHM6ICAgaEZyYW1lSW5mbyAgICAgICAgICAgICAtIEhBTkxERV9TQlJfRlJBTUVfSU5GTwogICAgICAgICAgICAgIG5FbnYgICAgICAgICAgICAgICAgICAgLSBJTlQKICAgICAgICAgICAgICBuVGltZVNsb3RzICAgICAgICAgICAgIC0gSU5UCgogUmV0dXJuOiAgICAgIG5vbmU7IGhTYnJGcmFtZUluZm8gY29udGFpbnMgYSBjb3B5IG9mIHRoZSBkZWZhdWx0IGZyYW1lSW5mbwoKIFdyaXR0ZW46ICAgICBBbmRyZWFzIFNjaG5laWRlcgogUmV2aXNlZDoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKY3JlYXRlRGVmRnJhbWVJbmZvKEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLCBJTlQgbkVudiwgSU5UIG5UaW1lU2xvdHMpCnsKICBzd2l0Y2ggKG5FbnYpIHsKICBjYXNlIDE6CiAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8xOTIwLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8xXzIwNDgsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzFfMTE1Miwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV8yMzA0LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMV81MTJMRCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIDI6CiAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8xOTIwLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm8yXzIwNDgsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzJfMTE1Miwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl8yMzA0LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvMl81MTJMRCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICB9CiAgICBicmVhazsKICBjYXNlIDQ6CiAgICBzd2l0Y2ggKG5UaW1lU2xvdHMpIHsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMTkyMDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8xOTIwLCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OgogICAgICBGREttZW1jcHkgKGhTYnJGcmFtZUluZm8sICZmcmFtZUluZm80XzIwNDgsIHNpemVvZiAoU0JSX0ZSQU1FX0lORk8pKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzExNTI6CiAgICAgIEZES21lbWNweSAoaFNickZyYW1lSW5mbywgJmZyYW1lSW5mbzRfMTE1Miwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGNhc2UgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF8yMzA0LCBzaXplb2YgKFNCUl9GUkFNRV9JTkZPKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU181MTJMRDoKICAgICAgRkRLbWVtY3B5IChoU2JyRnJhbWVJbmZvLCAmZnJhbWVJbmZvNF81MTJMRCwgc2l6ZW9mIChTQlJfRlJBTUVfSU5GTykpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgRkRLX0FTU0VSVCgwKTsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogRnVuY3Rpb25uYW1lOiAgY3RybFNpZ25hbDJGcmFtZUluZm8KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBEZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyBmcmFtZV9pbmZvIHN0cnVjdCBmcm9tIGNvbnRyb2wgc2lnbmFsLgoKIEFyZ3VtZW50czogICBoU2JyR3JpZCAtIHNvdXJjZQogICAgICAgICAgICAgIGhTYnJGcmFtZUluZm8gLSBkZXN0aW5hdGlvbgoKIFJldHVybjogICAgICB2b2lkOyBoU2JyRnJhbWVJbmZvIGNvbnRhaW5zIHRoZSB1cGRhdGVkIEZSQU1FX0lORk8gc3RydWN0CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApjdHJsU2lnbmFsMkZyYW1lSW5mbyAoSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAogICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJlcV9yZXNfZml4Zml4KQp7CiAgSU5UIG5FbnYgPSAwLCBib3JkZXIgPSAwLCBpLCBrLCBwIC8qPyovOwogIElOVCAqdl9yID0gaFNickdyaWQtPmJzX3JlbF9ib3JkOwogIElOVCAqdl9mID0gaFNickdyaWQtPnZfZjsKCiAgRlJBTUVfQ0xBU1MgZnJhbWVDbGFzcyA9IGhTYnJHcmlkLT5mcmFtZUNsYXNzOwogIElOVCBidWZmZXJGcmFtZVN0YXJ0ICAgPSBoU2JyR3JpZC0+YnVmZmVyRnJhbWVTdGFydDsKICBJTlQgbnVtYmVyVGltZVNsb3RzICAgID0gaFNickdyaWQtPm51bWJlclRpbWVTbG90czsKCiAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CiAgY2FzZSBGSVhGSVg6CiAgICBjcmVhdGVEZWZGcmFtZUluZm8oaFNickZyYW1lSW5mbywgaFNickdyaWQtPmJzX251bV9lbnYsIG51bWJlclRpbWVTbG90cyk7CgogICAgLyogQXQgdGhpcyBwb2ludCBhbGwgZnJlcXVlbmN5IHJlc29sdXRpb25zIGFyZSBzZXQgdG8gRlJFUV9SRVNfSElHSCwgc28KICAgICAqIG9ubHkgaWYgZnJlcV9yZXNfZml4Zml4IGlzIHNldCB0byBGUkVRX1JFU19MT1csIHRoZXkgYWxsIGhhdmUgdG8gYmUKICAgICAqIGNoYW5nZWQuCiAgICAgKiBzbmQgKi8KICAgIGlmIChmcmVxX3Jlc19maXhmaXggPT0gRlJFUV9SRVNfTE9XKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBpKyspIHsKICAgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gRlJFUV9SRVNfTE9XOwogICAgICB9CiAgICB9CiAgICAvKiBFTEQ6IHN0b3JlIGN1cnJlbnQgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICAgIGhTYnJHcmlkLT52X2ZbMF0gPSBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzWzBdOwogICAgYnJlYWs7CgogIGNhc2UgRklYVkFSOgogIGNhc2UgVkFSRklYOgogICAgbkVudiA9IGhTYnJHcmlkLT5uICsgMTsgICAgICAvKiByZWFkIG4gW1NCUl9OVU1fQklUUyBiaXRzXSAqLyAvKj8gc25kKi8KICAgIEZES19BU1NFUlQobkVudiA8PSBNQVhfRU5WRUxPUEVTX0ZJWFZBUl9WQVJGSVgpOwoKICAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OwoKICAgIGJvcmRlciA9IGhTYnJHcmlkLT5ic19hYnNfYm9yZDsgLyogcmVhZCB0aGUgYWJzb2x1dGUgYm9yZGVyICovCgogICAgaWYgKG5FbnYgPT0gMSkKICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKICAgIGVsc2UKICAgICAgaFNickZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMjsKCiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qIGRvIG5vdGhpbmcgKi8KICAgIGJyZWFrOwogIH0KCiAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CiAgY2FzZSBGSVhWQVI6CiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYnVmZmVyRnJhbWVTdGFydDsgLyogc3RhcnQtcG9zaXRpb24gb2YgMXN0IGVudmVsb3BlICovCgogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XSA9IGJvcmRlcjsKCiAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBuRW52IC0gMTsgaysrLCBpLS0pIHsKICAgICAgYm9yZGVyIC09IHZfcltrXTsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKICAgIH0KCiAgICAvKiBtYWtlIGVpdGhlciBlbnZlbG9wZSBuci4gbkVudiArIDEgLSBwIHNob3J0OyBvciBkb24ndCBzaG9ydGVuIGlmIHAgPT0gMCAqLwogICAgcCA9IGhTYnJHcmlkLT5wOwogICAgaWYgKHAgPT0gMCkgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CiAgICB9IGVsc2UgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IG5FbnYgKyAxIC0gcDsKICAgIH0KCiAgICBmb3IgKGsgPSAwLCBpID0gbkVudiAtIDE7IGsgPCBuRW52OyBrKyssIGktLSkgewogICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gKEZSRVFfUkVTKXZfZltrXTsKICAgIH0KCiAgICAvKiBpZiBlaXRoZXIgdGhlcmUgaXMgbm8gc2hvcnQgZW52ZWxvcGUgb3IgdGhlIGxhc3QgZW52ZWxvcGUgaXMgc2hvcnQuLi4gKi8KICAgIGlmIChwID09IDAgfHwgcCA9PSAxKSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbbkVudiAtIDFdOwogICAgfSBlbHNlIHsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CiAgICB9CgogICAgYnJlYWs7CgogIGNhc2UgVkFSRklYOgogICAgLyogaW4gdGhpcyBjYXNlICdib3JkZXInIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIDFzdCBlbnZlbG9wZSAqLwogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsKCiAgICBmb3IgKGsgPSAwOyBrIDwgbkVudiAtIDE7IGsrKykgewogICAgICBib3JkZXIgKz0gdl9yW2tdOwogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2sgKyAxXSA9IGJvcmRlcjsKICAgIH0KCiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYnVmZmVyRnJhbWVTdGFydCArIG51bWJlclRpbWVTbG90czsKCiAgICBwID0gaFNickdyaWQtPnA7CiAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IDA7CiAgICB9IGVsc2UgewogICAgICBoU2JyRnJhbWVJbmZvLT5zaG9ydEVudiA9IHAgLSAxOwogICAgfQoKICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChGUkVRX1JFUyl2X2Zba107CiAgICB9CgogICAgc3dpdGNoIChwKSB7CiAgICBjYXNlIDA6CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbMV07CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW2hTYnJGcmFtZUluZm8tPnNob3J0RW52XTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBWQVJWQVI6CiAgICBuRW52ID0gaFNickdyaWQtPmJzX251bV9yZWxfMCArIGhTYnJHcmlkLT5ic19udW1fcmVsXzEgKyAxOwogICAgRkRLX0FTU0VSVChuRW52IDw9IE1BWF9FTlZFTE9QRVNfVkFSVkFSKTsgLyoganVzdCB0byBiZSBzdXJlICovCiAgICBoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID0gbkVudjsKCiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzA7CgogICAgZm9yIChrID0gMCwgaSA9IDE7IGsgPCBoU2JyR3JpZC0+YnNfbnVtX3JlbF8wOyBrKyssIGkrKykgewogICAgICBib3JkZXIgKz0gaFNickdyaWQtPmJzX3JlbF9ib3JkXzBba107CiAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7CiAgICB9CgogICAgYm9yZGVyID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gYm9yZGVyOwoKICAgIGZvciAoayA9IDAsIGkgPSBuRW52IC0gMTsgayA8IGhTYnJHcmlkLT5ic19udW1fcmVsXzE7IGsrKywgaS0tKSB7CiAgICAgIGJvcmRlciAtPSBoU2JyR3JpZC0+YnNfcmVsX2JvcmRfMVtrXTsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKICAgIH0KCiAgICBwID0gaFNickdyaWQtPnA7CiAgICBpZiAocCA9PSAwKSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIGhTYnJGcmFtZUluZm8tPnNob3J0RW52ID0gbkVudiArIDEgLSBwOwogICAgfQoKICAgIGZvciAoayA9IDA7IGsgPCBuRW52OyBrKyspIHsKICAgICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IChGUkVRX1JFUyloU2JyR3JpZC0+dl9mTFJba107CiAgICB9CgogICAgaWYgKG5FbnYgPT0gMSkgewogICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAxOwogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CiAgICB9IGVsc2UgewogICAgICBoU2JyRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOwogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBoU2JyR3JpZC0+YnNfYWJzX2JvcmRfMDsKCiAgICAgIGlmIChwID09IDAgfHwgcCA9PSAxKSB7CiAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52IC0gMV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1toU2JyRnJhbWVJbmZvLT5zaG9ydEVudl07CiAgICAgIH0KICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gaFNickdyaWQtPmJzX2Fic19ib3JkXzE7CiAgICB9CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIC8qIGRvIG5vdGhpbmcgKi8KICAgIGJyZWFrOwogIH0KCiAgaWYgKGZyYW1lQ2xhc3MgPT0gVkFSRklYIHx8IGZyYW1lQ2xhc3MgPT0gRklYVkFSKSB7CiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzWzBdOwogICAgaWYgKG5FbnYgPT0gMSkgewogICAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdOwogICAgfSBlbHNlIHsKICAgICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzJdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKICAgIH0KICB9Cn0KCg==