Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgQS4gR3JvZXNjaGVsCiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCiNpbmNsdWRlICJiaXRlbmMuaCIKI2luY2x1ZGUgInBzeV9jb25zdC5oIgojaW5jbHVkZSAicWNfZGF0YS5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKCi8qIGNoYW5uZWxfYXNzaWdubWVudCB0cmVhdHMgdGhlIHJlbGF0aW9uc2hpcCBvZiBJbnB1dCBmaWxlIGNoYW5uZWxzCiAgIHRvIHRoZSBlbmNvZGVyIGNoYW5uZWxzLgogICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSB1c3VhbCBvcmRlciBpbiBSSUZGIGZpbGVzICgud2F2KQogICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZWxlbWVudHMgb3JkZXIgaW4gdGhlIGNvZGVyIGdpdmVuCiAgIGJ5IFRhYmxlIDguMSAoaW1wbGljaXQgc3BlYWtlciBtYXBwaW5nKSBvZiB0aGUgQUFDIHN0YW5kYXJkLgoKICAgSW4gbW9ubyBhbmQgc3RlcmVvIGNhc2UsIHRoaXMgaXMgdHJpdmlhbC4KICAgSW4gbWMgY2FzZSwgaXQgbG9va3MgbGlrZSB0aGlzOgoKICAgQ2hhbm5lbCAgICAgICAgIElucHV0IGZpbGUgICAgICAgY29kZXIgY2hhbgo1Y2g6CiAgIGZyb250IGNlbnRlciAgICAyICAgICAgICAgICAgICAgIDAgKFNDRSBjaGFubmVsKQogICBsZWZ0IGNlbnRlciAgICAgMCAgICAgICAgICAgICAgICAxICgxc3Qgb2YgMXN0IENQRSkKICAgcmlnaHQgY2VudGVyICAgIDEgICAgICAgICAgICAgICAgMiAoMm5kIG9mIDFzdCBDUEUpCiAgIGxlZnQgc3Vycm91bmQgICAzICAgICAgICAgICAgICAgIDMgKDFzdCBvZiAybmQgQ1BFKQogICByaWdodCBzdXJyb3VuZCAgNCAgICAgICAgICAgICAgICA0ICgybmQgb2YgMm5kIENQRSkKCjUuMWNoOgogICBmcm9udCBjZW50ZXIgICAgMiAgICAgICAgICAgICAgICAwIChTQ0UgY2hhbm5lbCkKICAgbGVmdCBjZW50ZXIgICAgIDAgICAgICAgICAgICAgICAgMSAoMXN0IG9mIDFzdCBDUEUpCiAgIHJpZ2h0IGNlbnRlciAgICAxICAgICAgICAgICAgICAgIDIgKDJuZCBvZiAxc3QgQ1BFKQogICBsZWZ0IHN1cnJvdW5kICAgNCAgICAgICAgICAgICAgICAzICgxc3Qgb2YgMm5kIENQRSkKICAgcmlnaHQgc3Vycm91bmQgIDUgICAgICAgICAgICAgICAgNCAoMm5kIG9mIDJuZCBDUEUpCiAgIExGRSAgICAgICAgICAgICAzICAgICAgICAgICAgICAgIDUgKExGRSkKKi8KCnR5cGVkZWYgc3RydWN0IHsKCiAgQ0hBTk5FTF9NT0RFICBlbmNvZGVyTW9kZTsKICBJTlQgICAgICAgICAgIGNoYW5uZWxfYXNzaWdubWVudFsvKig2KSovMTJdOwoKfSBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUI7CgoKc3RhdGljIGNvbnN0IENIQU5ORUxfQVNTSUdOTUVOVF9JTkZPX1RBQiBhc3NpZ25tZW50SW5mb1RhYk1wZWdbXSA9CnsKICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KICAgICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBzdGVyZW8gICAgKi8KICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KfTsKCnN0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJXYXZbXSA9CnsKICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KICAgICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBzdGVyZW8gICAgKi8KICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywgNCwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgNiwgNywgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KfTsKCi8qIENoYW5uZWwgbW9kZSBjb25maWd1cmF0aW9uIHRhYiBwcm92aWRlcywKICAgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGVsZW1lbnRzCiovCnN0YXRpYyBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiBjaGFubmVsTW9kZUNvbmZpZ1tdID0KewogICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgICAxLCAgMSwgIDEgfSwgICAvKiBTQ0UgICAgICAgICAgICAgICAgICovCiAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgIDIsICAyLCAgMSB9LCAgIC8qIENQRSAgICAgICAgICAgICAgICAgKi8KICAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICAgMywgIDMsICAyIH0sICAgLyogU0NFLENQRSAgICAgICAgICAgICAqLwogICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgICA0LCAgNCwgIDMgfSwgICAvKiBTQ0UsQ1BFLFNDRSAgICAgICAgICovCiAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgIDUsICA1LCAgMyB9LCAgIC8qIFNDRSxDUEUsQ1BFICAgICAgICAgKi8KICAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICAgNiwgIDUsICA0IH0sICAgLyogU0NFLENQRSxDUEUsTEZFICAgICAqLwogICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgICA4LCAgNywgIDUgfSwgICAvKiBTQ0UsQ1BFLENQRSxDUEUsTEZFICovCn07CgojZGVmaW5lIE1BWF9NT0RFUyAoc2l6ZW9mKGFzc2lnbm1lbnRJbmZvVGFiV2F2KS9zaXplb2YoQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCKSkKCmNvbnN0IElOVCogRkRLYWFjRW5jX2dldENoYW5uZWxBc3NpZ25tZW50KENIQU5ORUxfTU9ERSBlbmNNb2RlLCBDSEFOTkVMX09SREVSIGNvKQp7CiAgY29uc3QgQ0hBTk5FTF9BU1NJR05NRU5UX0lORk9fVEFCICpwVGFiOwogIGludCBpOwoKICBpZiAoY28gPT0gQ0hfT1JERVJfTVBFRykKICAgIHBUYWIgPSBhc3NpZ25tZW50SW5mb1RhYk1wZWc7CiAgZWxzZQogICAgcFRhYiA9IGFzc2lnbm1lbnRJbmZvVGFiV2F2OwoKICBmb3IoaT1NQVhfTU9ERVMtMTsgaT4wOyBpLS0pIHsKICAgIGlmIChlbmNNb2RlPT0gcFRhYltpXS5lbmNvZGVyTW9kZSkgewogICAgICBicmVhazsKICAgIH0KICB9CiAgcmV0dXJuIChwVGFiW2ldLmNoYW5uZWxfYXNzaWdubWVudCk7Cn0KCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19EZXRlcm1pbmVFbmNvZGVyTW9kZShDSEFOTkVMX01PREUqIG1vZGUsIElOVCBuQ2hhbm5lbHMpCnsKICBJTlQgaTsKICBDSEFOTkVMX01PREUgZW5jTW9kZSA9IE1PREVfSU5WQUxJRDsKCiAgaWYgKCptb2RlPT1NT0RFX1VOS05PV04pIHsKICAgIGZvciAoaT0wOyBpPChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKS8oSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7IGkrKykgewogICAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzPT1uQ2hhbm5lbHMpIHsKICAgICAgICAgIGVuY01vZGUgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgICptb2RlID0gZW5jTW9kZTsKICB9CiAgZWxzZSB7CiAgICAvKiBjaGVjayBpZiB2YWxpZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KICAgIGlmIChGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKCptb2RlKS0+bkNoYW5uZWxzPT1uQ2hhbm5lbHMpIHsKICAgICAgICBlbmNNb2RlID0gKm1vZGU7CiAgICB9CiAgfQoKICBpZiAoZW5jTW9kZT09TU9ERV9JTlZBTElEKSB7CiAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogIH0KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCnN0YXRpYyBJTlQgRkRLYWFjRW5jX2luaXRFbGVtZW50IChFTEVNRU5UX0lORk8qIGVsSW5mbywgTVA0X0VMRU1FTlRfSUQgZWxUeXBlLCBJTlQqIGNudCwgQ0hBTk5FTF9NT0RFIG1vZGUsIENIQU5ORUxfT1JERVIgY28sIElOVCogaXRfY250LCBjb25zdCBGSVhQX0RCTCByZWxCaXRzKSB7CgogIElOVCBlcnJvcj0wOwogIElOVCBjb3VudGVyID0qY250OwoKICBjb25zdCBJTlQgKmFzc2lnbiA9IEZES2FhY0VuY19nZXRDaGFubmVsQXNzaWdubWVudChtb2RlLCBjbyk7CgogIGVsSW5mby0+ZWxUeXBlPWVsVHlwZTsKICBlbEluZm8tPnJlbGF0aXZlQml0cyA9IHJlbEJpdHM7CgogIHN3aXRjaChlbEluZm8tPmVsVHlwZSkgewogIGNhc2UgSURfU0NFOiBjYXNlIElEX0xGRTogY2FzZSBJRF9DQ0U6CiAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MTsKICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPWFzc2lnbltjb3VudGVyKytdOwogICAgZWxJbmZvLT5pbnN0YW5jZVRhZz1pdF9jbnRbZWxUeXBlXSsrOwoKICAgIGJyZWFrOwogIGNhc2UgSURfQ1BFOgogICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsPTI7CiAgICBlbEluZm8tPkNoYW5uZWxJbmRleFswXT1hc3NpZ25bY291bnRlcisrXTsKICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzFdPWFzc2lnbltjb3VudGVyKytdOwogICAgZWxJbmZvLT5pbnN0YW5jZVRhZz1pdF9jbnRbZWxUeXBlXSsrOwogICAgYnJlYWs7CiAgY2FzZSBJRF9EU0U6CiAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MDsKICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7CiAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0wOwogICAgZWxJbmZvLT5pbnN0YW5jZVRhZz1pdF9jbnRbZWxUeXBlXSsrOwogICAgYnJlYWs7CiAgZGVmYXVsdDogZXJyb3I9MTsKICB9OwogICpjbnQgPSBjb3VudGVyOwogIHJldHVybiBlcnJvcjsKCn0KCkFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoQ0hBTk5FTF9NT0RFIG1vZGUsIENIQU5ORUxfT1JERVIgY28sIENIQU5ORUxfTUFQUElORyogY20pCnsKICBJTlQgY291bnQ9MDsgLyogY291bnQgdGhyb3VnaCBjb2RlciBjaGFubmVscyAqLwogIElOVCBpdF9jbnRbSURfRU5EKzFdOwogIElOVCBpOwoKICBmb3IgKGk9MDsgaTxJRF9FTkQ7IGkrKykKICAgIGl0X2NudFtpXT0wOwoKICBGREttZW1jbGVhcihjbSwgc2l6ZW9mKENIQU5ORUxfTUFQUElORykpOwoKICAvKiBpbml0IGNoYW5uZWwgbWFwcGluZyovCiAgZm9yIChpPTA7IGk8KElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpLyhJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsgaSsrKSB7CiAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZT09bW9kZSkKICAgIHsKICAgICAgICBjbS0+ZW5jTW9kZSAgICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZTsKICAgICAgICBjbS0+bkNoYW5uZWxzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkNoYW5uZWxzOwogICAgICAgIGNtLT5uQ2hhbm5lbHNFZmYgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHNFZmY7CiAgICAgICAgY20tPm5FbGVtZW50cyAgICA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5FbGVtZW50czsKCiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICAvKiBpbml0IGVsZW1lbnQgaW5mbyBzdHJ1Y3QgKi8KICBzd2l0Y2gobW9kZSkgewogICAgY2FzZSBNT0RFXzE6CiAgICAgIC8qIChtb25vKSBzY2UgICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIChGSVhQX0RCTClNQVhWQUxfREJMKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfMjoKICAgICAgLyogKHN0ZXJlbykgY3BlICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIChGSVhQX0RCTClNQVhWQUxfREJMKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RFXzFfMjoKICAgICAgLyogc2NlICsgY3BlICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNGYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC42ZikpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfMV8yXzE6CiAgICAgIC8qIHNjZSArIGNwZSArIHNjZSAqLwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuNGYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zZikpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfMV8yXzI6CiAgICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjM3ZikpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfMV8yXzJfMToKICAgICAgLyogKDUuMSkgc2NlICsgY3BlICsgY3BlICsgbGZlICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjRmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzVmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1szXSwgSURfTEZFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMDZmKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV8xXzJfMl8yXzE6CiAgICAgIC8qICg3LjEpIHNjZSArIGNwZSArIGNwZSArIGNwZSArIGxmZSAqLwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMF0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjE4ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bM10sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjI2ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bNF0sIElEX0xGRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjA0ZikpOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAvLypjaE1hcD0wOwogICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogIH07CgoKICBGREtfQVNTRVJUKGNtLT5uRWxlbWVudHM8PSg2KSk7CgoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSAqaFFDLAogICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCiAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsCiAgICAgICAgICAgICAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzVG90LAogICAgICAgICAgICAgICAgICAgIElOVCBtYXhDaGFubmVsQml0cykKewogIGludCBzY19iclRvdCA9IENvdW50TGVhZGluZ0JpdHMoYml0cmF0ZVRvdCk7CgogIHN3aXRjaChjbS0+ZW5jTW9kZSkgewogIGNhc2UgTU9ERV8xOgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGJpdHJhdGVUb3Q7CgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGJyZWFrOwoKICBjYXNlIE1PREVfMjoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBiaXRyYXRlVG90Pj4xOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGJyZWFrOwogIGNhc2UgTU9ERV8xXzI6IHsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgc2NlUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgYnJlYWs7CiAgfQogIGNhc2UgTU9ERV8xXzJfMTogewogICAgLyogc2NlICsgY3BlICsgc2NlICovCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBzY2UxUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlUmF0ZSAgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIHNjZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2UyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGJyZWFrOwogIH0KICBjYXNlIE1PREVfMV8yXzI6IHsKICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBicmVhazsKICB9CgogIGNhc2UgTU9ERV8xXzJfMl8xOiB7CiAgICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBzY2VSYXRlICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlMVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBsZmVSYXRlICA9IGNtLT5lbEluZm9bM10ucmVsYXRpdmVCaXRzOwoKICAgIGludCBtYXhCaXRzVG90ID0gbWF4Q2hhbm5lbEJpdHMgKiA1OyAvKiBMRkUgZG9lcyBub3QgYWRkIHRvIGJpdCByZXNlcnZvaXIgKi8KICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLGF2ZXJhZ2VCaXRzVG90KSk7CiAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpIEZES21heCAoIChJTlQpKChmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkobWF4Q2hhbm5lbEJpdHM8PHNjKSk+PnNjKTw8MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmLzIuZiksZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKGF2ZXJhZ2VCaXRzVG90PDxzYykpKTw8MSk+PnNjKSApOwoKICAgIG1heENoYW5uZWxCaXRzID0gKG1heEJpdHNUb3QgLSBtYXhMZmVCaXRzKTsKICAgIHNjID0gQ291bnRMZWFkaW5nQml0cyhtYXhDaGFubmVsQml0cyk7CgogICAgbWF4Q2hhbm5lbEJpdHMgPSBmTXVsdCgoRklYUF9EQkwpbWF4Q2hhbm5lbEJpdHM8PHNjLEdldEludkludCg1KSk+PnNjOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwogICAgaFFDLT5lbGVtZW50Qml0c1szXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4TGZlQml0czsKCiAgICBicmVhazsKICB9CgogIGNhc2UgTU9ERV8xXzJfMl8yXzE6ewogICAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzRdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bNF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlM1JhdGUgPSBjbS0+ZWxJbmZvWzNdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGxmZVJhdGUgID0gY20tPmVsSW5mb1s0XS5yZWxhdGl2ZUJpdHM7CgogICAgaW50IG1heEJpdHNUb3QgPSBtYXhDaGFubmVsQml0cyAqIDc7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLwogICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsYXZlcmFnZUJpdHNUb3QpKTsKICAgIGludCBtYXhMZmVCaXRzID0gKGludCkgRkRLbWF4ICggKElOVCkoKGZNdWx0KGxmZVJhdGUsKEZJWFBfREJMKShtYXhDaGFubmVsQml0czw8c2MpKT4+c2MpPDwxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSxmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3Q8PHNjKSkpPDwxKT4+c2MpICk7CgogICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpIC8gNzsKCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KHNjZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPmNoQml0cmF0ZUVsID0gZk11bHQoY3BlM1JhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwogICAgaFFDLT5lbGVtZW50Qml0c1s0XS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChsZmVSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5tYXhCaXRzRWwgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1szXS0+bWF4Qml0c0VsID0gMiptYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbNF0tPm1heEJpdHNFbCA9IG1heExmZUJpdHM7CiAgICBicmVhazsKICB9CgogIGRlZmF1bHQ6CiAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogIH0KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBmdW5jdGlvbjogICAgR2V0TW9ub1N0ZXJlb01PREUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogZGVzY3JpcHRpb246IERldGVybWluZXMgZW5jb2RlciBzZXR0aW5nIGZyb20gY2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgTXVsdGljaGFubmVsIG1vZGVzIGFyZSBtYXBwZWQgdG8gbW9ubyBvciBzdGVyZW8gbW9kZXMgICAgICAgICAgICovCi8qICAgICAgICAgICAgICByZXR1cm5zIE1PREVfTU9OTyBpbiBjYXNlIG9mIG1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgTU9ERV9TVEVSRU8gaW4gY2FzZSBvZiBzdGVyZW8gICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lOVkFMSUQgaW4gY2FzZSBvZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogaW5wdXQ6ICAgICAgIENIQU5ORUxfTU9ERSBtb2RlOiBFbmNvZGVyIG1vZGUgKHNlZSBxY19kYXRhLmgpLiAgICAgICAgICAgICAgICAqLwovKiBvdXRwdXQ6ICAgICAgcmV0dXJuOiBDTV9TVEVSRU9fTU9ERSBtb25vU3RlcmVvU2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAoTU9ERV9JTlZBTElEOiBlcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICBNT0RFX01PTk86ICAgIG1vbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgIE1PREVfU1RFUkVPOiAgc3RlcmVvKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogbWlzYzogICAgICAgIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkVMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpewoKICBFTEVNRU5UX01PREUgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX0lOVkFMSUQ7CgogIHN3aXRjaChtb2RlKXsKICBjYXNlIE1PREVfMTogICAgICAgIC8qIG1vbm8gc2V0dXBzICovCiAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfTU9OTzsKICAgIGJyZWFrOwogIGNhc2UgTU9ERV8yOiAgICAgICAgLyogc3RlcmVvIHNldHVwcyAqLwogIGNhc2UgTU9ERV8xXzI6CiAgY2FzZSBNT0RFXzFfMl8xOgogIGNhc2UgTU9ERV8xXzJfMjoKICBjYXNlIE1PREVfMV8yXzJfMToKICBjYXNlIE1PREVfMV8yXzJfMl8xOgogICAgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX1NURVJFTzsKICAgIGJyZWFrOwogIGRlZmF1bHQ6ICAgICAgICAgICAgLyogZXJyb3IgKi8KICAgIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9JTlZBTElEOwogICAgYnJlYWs7CiAgfQoKICByZXR1cm4gbW9ub1N0ZXJlb1NldHRpbmc7Cn0KCmNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKiBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNvbnN0IENIQU5ORUxfTU9ERSBtb2RlKQp7CiAgSU5UIGk7CiAgY29uc3QgQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIgKmNtX2NvbmZpZyA9IE5VTEw7CgogIC8qIGdldCBjaGFubmVsIG1vZGUgY29uZmlnICovCiAgZm9yIChpPTA7IGk8KElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpLyhJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsgaSsrKSB7CiAgICBpZiAoY2hhbm5lbE1vZGVDb25maWdbaV0uZW5jTW9kZT09bW9kZSkKICAgIHsKICAgICAgICBjbV9jb25maWcgPSAmY2hhbm5lbE1vZGVDb25maWdbaV07CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiBjbV9jb25maWc7Cn0K