Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwKICAgRGVzY3JpcHRpb246CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIEFBQ0RFQ09ERVJfSAojZGVmaW5lIEFBQ0RFQ09ERVJfSAoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCgojaW5jbHVkZSAiY2hhbm5lbC5oIgoKI2luY2x1ZGUgInRwZGVjX2xpYi5oIgojaW5jbHVkZSAiRkRLX2F1ZGlvLmgiCgojaW5jbHVkZSAiYmxvY2suaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKCiNpbmNsdWRlICJzYnJkZWNvZGVyLmgiCgoKI2luY2x1ZGUgImFhY2RlY19kcmMuaCIKCiAjaW5jbHVkZSAicGNtdXRpbHNfbGliLmgiCiAjaW5jbHVkZSAibGltaXRlci5oIgoKCi8qIENhcGFiaWxpdGllcyBmbGFncyAqLwojZGVmaW5lIENBUEZfQUFDX0xDICAgICAgICAgICAweDAwMDAwMDAxCiNkZWZpbmUgQ0FQRl9BQUNfTEQgICAgICAgICAgIDB4MDAwMDAwMDIKI2RlZmluZSBDQVBGX0FBQ19TQ0FMICAgICAgICAgMHgwMDAwMDAwNAojZGVmaW5lIENBUEZfQUFDX0VSICAgICAgICAgICAweDAwMDAwMDA4CiNkZWZpbmUgQ0FQRl9BQUNfNDgwICAgICAgICAgIDB4MDAwMDAwMTAKI2RlZmluZSBDQVBGX0FBQ181MTIgICAgICAgICAgMHgwMDAwMDAyMAojZGVmaW5lIENBUEZfQUFDXzk2MCAgICAgICAgICAweDAwMDAwMDQwCiNkZWZpbmUgQ0FQRl9BQUNfMTAyNCAgICAgICAgIDB4MDAwMDAwODAKI2RlZmluZSBDQVBGX0FBQ19IQ1IgICAgICAgICAgMHgwMDAwMDEwMAojZGVmaW5lIENBUEZfQUFDX1ZDQjExICAgICAgICAweDAwMDAwMjAwCiNkZWZpbmUgQ0FQRl9BQUNfUlZMQyAgICAgICAgIDB4MDAwMDA0MDAKI2RlZmluZSBDQVBGX0FBQ19NUEVHNCAgICAgICAgMHgwMDAwMDgwMCAvKiBQTlMgKi8KI2RlZmluZSBDQVBGX0FBQ19EUkMgICAgICAgICAgMHgwMDAwMTAwMAojZGVmaW5lIENBUEZfQUFDX0NPTkNFQUwgICAgICAweDAwMDAyMDAwCiNkZWZpbmUgQ0FQRl9BQUNfRFJNX0JTRk9STUFUIDB4MDAwMDQwMDAKI2RlZmluZSBDQVBGX0FBQ19CU0FDICAgICAgICAgMHgwMDAwODAwMAoKdHlwZWRlZiBzdHJ1Y3QgQUFDX0RFQ09ERVJfSU5TVEFOQ0UgKkhBTkRMRV9BQUNERUNPREVSOwoKCmVudW0KewogIEwgPSAwLAogIFIgPSAxCn07Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAgICBpbnQgYnVmZmVyU2l6ZTsKICAgIGludCBvZmZzZXRbOF07CiAgICBpbnQgbnJFbGVtZW50czsKfSBDQW5jRGF0YTsKCnR5cGVkZWYgZW51bSB7CiAgTk9UX0RFRklORUQgPSAtMSwKICBNT0RFX0hRICAgICA9ICAwLAogIE1PREVfTFAgICAgID0gIDEKfSBRTUZfTU9ERTsKCnR5cGVkZWYgc3RydWN0IHsKICBpbnQgICAgICAgIGJzRGVsYXk7Cn0gU0JSX1BBUkFNUzsKCgovKiBBQUMgZGVjb2RlciAob3BhcXVlIHRvd2FyZCB1c2VybGFuZCkgc3RydWN0IGRlY2xhcmF0aW9uICovCnN0cnVjdCBBQUNfREVDT0RFUl9JTlNUQU5DRSB7CiAgSU5UICAgICAgICAgICAgICAgICAgIGFhY0NoYW5uZWxzOyAgICAgICAgICAgICAgICAgLyohPCBBbW91bnQgb2YgQUFDIGRlY29kZXIgY2hhbm5lbHMgYWxsb2NhdGVkLiAgICAgICAgKi8KICBJTlQgICAgICAgICAgICAgICAgICAgYXNjQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBBQUMgZGVjb2RlciBjaGFubmVscyBzaWduYWxsZWQgaW4gQVNDLiAqLwogIElOVCAgICAgICAgICAgICAgICAgICBibG9ja051bWJlcjsgICAgICAgICAgICAgICAgIC8qITwgZnJhbWUgY291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogIElOVCAgICAgICAgICAgICAgICAgICBuck9mTGF5ZXJzOwoKICBJTlQgICAgICAgICAgICAgICAgICAgb3V0cHV0SW50ZXJsZWF2ZWQ7ICAgICAgICAgICAvKiE8IFBDTSBvdXRwdXQgZm9ybWF0IChpbnRlcmxlYXZlZC9ub25lIGludGVybGVhdmVkKS4gKi8KCiAgSEFORExFX1RSQU5TUE9SVERFQyAgIGhJbnB1dDsgICAgICAgICAgICAgICAgICAgICAgLyohPCBUcmFuc3BvcnQgbGF5ZXIgaGFuZGxlLiAqLwoKICBTYW1wbGluZ1JhdGVJbmZvICAgICAgc2FtcGxpbmdSYXRlSW5mbzsgICAgICAgICAgICAvKiE8IFNhbXBsaW5nIFJhdGUgaW5mb3JtYXRpb24gdGFibGUgKi8KCiAgVUNIQVIgICAgICAgICAgICAgICAgIGZyYW1lT0s7ICAgICAgICAgICAgICAgICAgICAgLyohPCBXaWxsIGJlIHVuc2V0IGlmIGEgY29uc2lzdGVuY3kgY2hlY2ssIGUuZy4gQ1JDIGV0Yy4gZmFpbHMgKi8KCiAgVUlOVCAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgLyohPCBGbGFncyBmb3IgaW50ZXJuYWwgZGVjb2RlciB1c2UuIERPIE5PVCBVU0Ugc2VsZjo6c3RyZWFtaW5mbzo6ZmxhZ3MgISAqLwoKICBNUDRfRUxFTUVOVF9JRCAgICAgICAgZWxlbWVudHNbKDgpXTsgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudCBJZCdzIGFyZSBsaXN0ZWQgICAgICAgICAgKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgZWxUYWdzWyg4KV07ICAgLyohPCBUYWJsZSB3aGVyZSB0aGUgZWxlbWVudHMgaWQgVGFncyBhcmUgbGlzdGVkICAgICAgKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgY2hNYXBwaW5nWyg4KV07ICAgLyohPCBUYWJsZSBvZiBNUEVHIGNhbm9uaWNhbCBvcmRlciB0byBiaXRzdHJlYW0gY2hhbm5lbCBvcmRlciBtYXBwaW5nLiAqLwoKICBBVURJT19DSEFOTkVMX1RZUEUgICAgY2hhbm5lbFR5cGVbKDgpXTsgICAgLyohPCBBdWRpbyBjaGFubmVsIHR5cGUgb2YgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCAoZnJvbSAwIHVwdG8gbnVtQ2hhbm5lbHMpLiAgICAgICAgICAgKi8KICBVQ0hBUiAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbKDgpXTsgLyohPCBBdWRpbyBjaGFubmVsIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIChmcm9tIDAgdXB0byBudW1DaGFubmVscykuICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMuMiBFeHBsaWNpdCBjaGFubmVsIG1hcHBpbmcgdXNpbmcgYSBwcm9ncmFtX2NvbmZpZ19lbGVtZW50KCkgKi8KCgogIGNvbnN0IFVDSEFSICAgICAgICAgKCpjaGFubmVsT3V0cHV0TWFwcGluZylbOF07ICAgIC8qITwgVGFibGUgZm9yIE1QRUcgY2Fub25pY2FsIG9yZGVyIHRvIG91dHB1dCBjaGFubmVsIG9yZGVyIG1hcHBpbmcuICovCiAgVUNIQVIgICAgICAgICAgICAgICAgIGNoTWFwSW5kZXg7ICAgICAgICAgICAgICAgICAgLyohPCBJbmRleCB0byBhY2Nlc3Mgb25lIGxpbmUgb2YgdGhlIGNoYW5uZWxPdXRwdXRNYXBwaW5nIHRhYmxlLiBUaGlzIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG5vdCBhbGwgOCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIGhhdmUgdGhlIHNhbWUgb3V0cHV0IG1hcHBpbmcuICovCgogIENQcm9ncmFtQ29uZmlnICAgICAgICAgICAgICAgIHBjZTsKICBDU3RyZWFtSW5mbyAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvOyAgICAgICAgIC8qITwgcG9pbnRlciB0byBTdHJlYW1JbmZvIGRhdGEgKHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtKSAqLwogIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gICAgICAgKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm9bKDgpXTsgICAgICAgLyohPCBUZW1wb3JhbCBjaGFubmVsIG1lbW9yeSAqLwogIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm9bKDgpXTsgLyohPCBQZXJzaXN0ZW50IGNoYW5uZWwgbWVtb3J5ICovCgogIENBYWNEZWNvZGVyQ29tbW9uRGF0YSAgICAgICAgIGFhY0NvbW1vbkRhdGE7ICAgICAgICAgICAgIC8qITwgVGVtcG9yYWwgc2hhcmVkIGRhdGEgZm9yIGFsbCBjaGFubmVscyBob29rZWQgaW50byBwQWFjRGVjb2RlckNoYW5uZWxJbmZvICovCgogIENDb25jZWFsUGFyYW1zICAgICAgICAgICAgICAgIGNvbmNlYWxDb21tb25EYXRhOwoKICBJTlQgICAgICAgICAgICAgICAgICAgYWFjQ2hhbm5lbHNQcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgYW1vdW50IG9mIEFBQyBjb3JlIGNoYW5uZWxzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgZGVjb2RlIGNhbGwuICAgICAgICAgKi8KICBBVURJT19DSEFOTkVMX1RZUEUgICAgY2hhbm5lbFR5cGVQcmV2Wyg4KV07ICAgICAvKiE8IEFycmF5IGhvbGRpbmcgdGhlIGNoYW5uZWxUeXBlIHZhbHVlcyBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGRlY29kZSBjYWxsLiAgICAqLwogIFVDSEFSICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1ByZXZbKDgpXTsgIC8qITwgQXJyYXkgaG9sZGluZyB0aGUgY2hhbm5lbEluZGljZXMgdmFsdWVzIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgZGVjb2RlIGNhbGwuICovCgoKICBIQU5ETEVfU0JSREVDT0RFUiAgIGhTYnJEZWNvZGVyOyAgICAgICAgICAgICAgICAgICAvKiE8IFNCUiBkZWNvZGVyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwogIFVDSEFSICAgICAgICAgICAgICAgc2JyRW5hYmxlZDsgICAgICAgICAgICAgICAgICAgIC8qITwgZmxhZyB0byBzdG9yZSBpZiBTQlIgaGFzIGJlZW4gZGV0ZWN0ZWQgICAgICovCiAgVUNIQVIgICAgICAgICAgICAgICBzYnJFbmFibGVkUHJldjsgICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFNCUiBoYXMgYmVlbiBkZXRlY3RlZCBmcm9tIHByZXZpb3VzIGZyYW1lICovCiAgVUNIQVIgICAgICAgICAgICAgICBwc1Bvc3NpYmxlOyAgICAgICAgICAgICAgICAgICAgLyohPCBmbGFnIHRvIHN0b3JlIGlmIFBTIGlzIHBvc3NpYmxlICAgICAgICAgICAgKi8KICBTQlJfUEFSQU1TICAgICAgICAgIHNiclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0cnVjdCB0byBzdG9yZSBhbGwgc2JyIHBhcmFtZXRlcnMgICAgICAgICAqLwoKICBRTUZfTU9ERSAgIHFtZk1vZGVDdXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IFRoZSBjdXJyZW50IFFNRiBtb2RlICAgICAgICAgICAgICAgICAgICAgICAqLwogIFFNRl9NT0RFICAgcW1mTW9kZVVzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgVGhlIFFNRiBtb2RlIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCgogIEhBTkRMRV9BQUNfRFJDICBoRHJjSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIERSQyBkYXRhIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCgoKICBDQW5jRGF0YSAgICAgIGFuY0RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IHN0cnVjdHVyZSB0byBoYW5kbGUgYW5jaWxsYXJ5IGRhdGEgICAgICAgICAqLwoKICBIQU5ETEVfUENNX0RPV05NSVggIGhQY21VdGlsczsgICAgICAgICAgICAgICAgICAgICAvKiE8IHByaXZhdCBkYXRhIGZvciB0aGUgUENNIHV0aWxzLiAgICAgICAgICAgICAqLwogIFRETGltaXRlclB0ciBoTGltaXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSGFuZGxlIG9mIHRpbWUgZG9tYWluIGxpbWl0ZXIuICAgICAgICAgICAgICovCiAgVUNIQVIgICAgICAgIGxpbWl0ZXJFbmFibGVVc2VyOyAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgbGltaXRlciBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgbGlicmFyeSB1c2VyICovCiAgVUNIQVIgICAgICAgIGxpbWl0ZXJFbmFibGVDdXJyOyAgICAgICAgICAgICAgICAgICAgLyohPCBUaGUgY3VycmVudCBsaW1pdGVyIGNvbmZpZ3VyYXRpb24uICAgICAgICAgKi8KCiAgRklYUF9EQkwgICAgIGV4dEdhaW5bMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBHYWluIHRoYXQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc2lnbmFsLiAqLwogIFVJTlQgICAgICAgICBleHRHYWluRGVsYXk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgRGVsYXkgdGhhdCBtdXN0IGJlIGFjY291bnRlZCBmb3IgZXh0R2Fpbi4gKi8KCiAgSU5UX1BDTSAgICAgIHBjbU91dHB1dEJ1ZmZlclsoOCkqKDIwNDgpXTsKCn07CgoKI2RlZmluZSBBQUNfREVCVUdfRVhUSExQICJcCi0tLSBBQUMtQ29yZSAtLS1cblwKICAgIDB4MDAwMTAwMDAgSGVhZGVyIGRhdGFcblwKICAgIDB4MDAwMjAwMDAgQ1JDIGRhdGFcblwKICAgIDB4MDAwNDAwMDAgQ2hhbm5lbCBpbmZvXG5cCiAgICAweDAwMDgwMDAwIFNlY3Rpb24gZGF0YVxuXAogICAgMHgwMDEwMDAwMCBTY2FsZWZhY3RvciBkYXRhXG5cCiAgICAweDAwMjAwMDAwIFB1bHNlIGRhdGFcblwKICAgIDB4MDA0MDAwMDAgVG5zIGRhdGFcblwKICAgIDB4MDA4MDAwMDAgUXVhbnRpemVkIHNwZWN0cnVtXG5cCiAgICAweDAxMDAwMDAwIFJlcXVhbnRpemVkIHNwZWN0cnVtXG5cCiAgICAweDAyMDAwMDAwIFRpbWUgb3V0cHV0XG5cCiAgICAweDA0MDAwMDAwIEZhdGFsIGVycm9yc1xuXAogICAgMHgwODAwMDAwMCBCdWZmZXIgZnVsbG5lc3NcblwKICAgIDB4MTAwMDAwMDAgQXZlcmFnZSBiaXRyYXRlXG5cCiAgICAweDIwMDAwMDAwIFN5bmNocm9uaXphdGlvblxuXAogICAgMHg0MDAwMDAwMCBDb25jZWFsbWVudFxuXAogICAgMHg3RkZGMDAwMCBhbGwgQUFDLUNvcmUtSW5mb1xuXAoiCgovKioKICogXGJyaWVmIFN5bmNocm9uaXNlIFFNRiBtb2RlIGZvciBhbGwgbW9kdWxlcyB1c2luZyBRTUYgZGF0YS4KICogXHBhcmFtIHNlbGYgZGVjb2RlciBoYW5kbGUKICovCnZvaWQgQ0FhY0RlY29kZXJfU3luY1FtZk1vZGUoSEFORExFX0FBQ0RFQ09ERVIgc2VsZik7CgovKioKICogXGJyaWVmIFNpZ25hbCBhIGJpdCBzdHJlYW0gaW50ZXJydXB0aW9uIHRvIHRoZSBkZWNvZGVyCiAqIFxwYXJhbSBzZWxmIGRlY29kZXIgaGFuZGxlCiAqLwp2b2lkIENBYWNEZWNvZGVyX1NpZ25hbEludGVycnVwdGlvbihIQU5ETEVfQUFDREVDT0RFUiBzZWxmKTsKCi8qIQogIFxicmllZiBJbml0aWFsaXplIGFuY2lsbGFyeSBidWZmZXIKCiAgXGFuY0RhdGEgUG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3R1cmUKICBcYnVmZmVyIFBvaW50ZXIgdG8gKGV4dGVybmFsKSBhbmMgZGF0YSBidWZmZXIKICBcc2l6ZSBTaXplIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBvbiBieSBidWZmZXIKCiAgXHJldHVybiAgRXJyb3IgY29kZQoqLwpBQUNfREVDT0RFUl9FUlJPUiBDQWFjRGVjb2Rlcl9BbmNEYXRhSW5pdChDQW5jRGF0YSAqYW5jRGF0YSwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CgovKiEKICBcYnJpZWYgR2V0IG9uZSBhbmNpbGxhcnkgZGF0YSBlbGVtZW50CgogIFxhbmNEYXRhIFBvaW50ZXIgdG8gYW5jaWxsYXJ5IGRhdGEgc3RydWN0dXJlCiAgXGluZGV4IEluZGV4IG9mIHRoZSBhbmMgZGF0YSBlbGVtZW50IHRvIGdldAogIFxwdHIgUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgYSBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgYW5jIGRhdGEgZWxlbWVudAogIFxzaXplIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3RlZCBhbmMgZGF0YSBlbGVtZW50CgogIFxyZXR1cm4gIEVycm9yIGNvZGUKKi8KQUFDX0RFQ09ERVJfRVJST1IgQ0FhY0RlY29kZXJfQW5jRGF0YUdldChDQW5jRGF0YSAqYW5jRGF0YSwgaW50IGluZGV4LCB1bnNpZ25lZCBjaGFyICoqcHRyLCBpbnQgKnNpemUpOwoKCi8qIGluaXRpYWxpemF0aW9uIG9mIGFhYyBkZWNvZGVyICovCkxJTktTUEVDX0ggSEFORExFX0FBQ0RFQ09ERVIgQ0FhY0RlY29kZXJfT3BlbihUUkFOU1BPUlRfVFlQRSBic0Zvcm1hdCk7CgovKiBJbml0aWFsaXphdGlvbiBvZiBzdHJlYW0taW5mbyBlbGVtZW50cyAqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0luaXQoSEFORExFX0FBQ0RFQ09ERVIgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENTQXVkaW9TcGVjaWZpY0NvbmZpZyAqYXNjKTsKCi8qIQogIFxicmllZiBEZWNvZGVzIG9uZSBhYWMgZnJhbWUKCiAgVGhlIGZ1bmN0aW9uIGRlY29kZXMgb25lIGFhYyBmcmFtZS4gVGhlIGRlY29kaW5nIG9mIGNvdXBsaW5nIGNoYW5uZWwKICBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhlIHRyYW5zcG9ydCBsYXllciBtaWdodCBzaWduYWwsIHRoYXQgdGhlCiAgZGF0YSBvZiB0aGUgY3VycmVudCBmcmFtZSBpcyBpbnZhbGlkLCBlLmcuIGFzIGEgcmVzdWx0IG9mIGEgcGFja2V0CiAgbG9zcyBpbiBzdHJlYW1pbmcgbW9kZS4KICBUaGUgYml0c3RyZWFtIHBvc2l0aW9uIG9mIHRyYW5zcG9ydERlY19HZXRCaXRzdHJlYW0oc2VsZi0+aElucHV0KSBtdXN0CiAgYmUgZXhhY3RseSB0aGUgZW5kIG9mIHRoZSBhY2Nlc3MgdW5pdCwgaW5jbHVkaW5nIGFsbCBieXRlIGFsaWdubWVudCBiaXRzLgogIEZvciB0aGlzIHB1cnBvc2UsIHRoZSB2YXJpYWJsZSBhdVN0YXJ0QW5jaG9yIGlzIHVzZWQuCgogIFxyZXR1cm4gIGVycm9yIHN0YXR1cwoqLwpMSU5LU1BFQ19IIEFBQ19ERUNPREVSX0VSUk9SIENBYWNEZWNvZGVyX0RlY29kZUZyYW1lKAogICAgICAgIEhBTkRMRV9BQUNERUNPREVSIHNlbGYsCiAgICAgICAgY29uc3QgVUlOVCBmbGFncywKICAgICAgICBJTlRfUENNICpwVGltZURhdGEsCiAgICAgICAgY29uc3QgSU5UICB0aW1lRGF0YVNpemUsCiAgICAgICAgY29uc3QgSU5UIGludGVybGVhdmVkCiAgICAgICAgKTsKCi8qIERlc3Ryb3kgYWFjIGRlY29kZXIgKi8KTElOS1NQRUNfSCB2b2lkIENBYWNEZWNvZGVyX0Nsb3NlICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOwoKLyogZ2V0IHN0cmVhbWluZm8gaGFuZGxlIGZyb20gZGVjb2RlciAqLwpMSU5LU1BFQ19IIENTdHJlYW1JbmZvKiBDQWFjRGVjb2Rlcl9HZXRTdHJlYW1JbmZvICggSEFORExFX0FBQ0RFQ09ERVIgc2VsZiApOwoKCiNlbmRpZiAvKiAjaWZuZGVmIEFBQ0RFQ09ERVJfSCAqLwo=