Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1dGlscyBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKICAgRGVzY3JpcHRpb246IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBkb3dubWl4aW5nIG9yIGEgc2ltcGxlIGNoYW5uZWwKICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPGxvZy9sb2cuaD4KI2luY2x1ZGUgInBjbXV0aWxzX2xpYi5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCiNpbmNsdWRlICJGREtfY29yZS5oIgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICBHTE9CQUwgU0VUVElOR1MgKEdGUik6ICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwojZGVmaW5lIERTRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcvRVRTSSBEVkIgYW5jaWxsYXJ5IGRhdGEgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXNzaXN0ZWQgZG93bm1peGluZyBvZiBNUEVHLTQgQUFDIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTEvMiBsYXllciAyIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFBDRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcgbWF0cml4IG1peGRvd24gd2l0aCBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IGNhcnJpZWQgaW4gdGhlIFBDRS4gICAgICAgICAgICAgICAgICAgICAgICovCgojZGVmaW5lIFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTICAgICAgICAgICggOCApICAgLyogTmVpdGhlciB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5wdXQgbm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgLi4uICovCiNkZWZpbmUgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTICAgICAgICAgKCA4ICkgICAvKiAuLi4gbXVzdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgdGhlIGZyYW1ld29yayBjYW4gaGFuZGxlLiAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogICAgU1BFQ0lGSUMgU0VUVElOR1M6ICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiNkZWZpbmUgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAgICAgICAgICAgICAvKiE8IEFsbG93IG1vZHVsZSB0byBkdXBsaWNhdGUgbW9ubyBzaWduYWxzIG9yIGFkZCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gKi8KCiNkZWZpbmUgUENNX0RNWF9ERkxUX01BWF9PVVRfQ0hBTk5FTFMgICAgKCA2ICkgICAvKiE8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYSBtaXhkb3duIGZvciBhbGwgaW5wdXQgc2lnbmFscyB3aXRoIG1vcmUgY2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQuICovCiNkZWZpbmUgUENNX0RNWF9ERkxUX01JTl9PVVRfQ0hBTk5FTFMgICAgKCAwICkgICAvKiE8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZG8gY2hhbm5lbCBleHRlbnNpb24gYXV0b21hdGljYWxseSBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBsZXNzIGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwojZGVmaW5lIFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUyAgICAgICAgICggMSApICAgLyohPCBUaGUgbWF4aW11bSBkZWxheSBmcmFtZXMgdG8gYWxpZ24gdGhlIGJpdHN0cmVhbXMgcGF5bG9hZCB3aXRoIHRoZSBQQ00gb3V0cHV0LiAqLwojZGVmaW5lIFBDTV9ETVhfREZMVF9FWFBJUllfRlJBTUUgICAgICAgICggNTAgKSAgLyohPCBJZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbWl4ZG93biBjb2VmZmljaWVudHMgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGZyYW1lcy4gVGhlIHZhbHVlIDUwIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IDUwMG1zIChGTCA5NjAgQCA5NmtIeikgKi8KLyogI2RlZmluZSBQQ01ETVhfREVCVUcgKi8KCi8qIERlcml2ZWQgc2V0dGluZzoKICogICBObyBuZWVkIHRvIGVkaXQgYmV5b25kIHRoaXMgbGluZS4gKi8KI2lmIGRlZmluZWQoRFNFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChQQ0VfTUVUQURBVEFfRU5BQkxFKSB8fCBkZWZpbmVkKEFSSUJfTUlYRE9XTl9FTkFCTEUpCiAjZGVmaW5lIFBDTV9ET1dOTUlYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYWxseSBlbmFibGUgZG93biBtaXhpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICovCiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gMikgfHwgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCA4ICkKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDQgKQogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgLyogQWxsIGNoYW5uZWxzIGNhbiBiZSBpbiBvbmUgZ3JvdXAgKi8KI2Vsc2UKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFMgICAgICAgICAgICAoIDMgKSAgIC8qIE5lZWQgdG8gYWRkIDEgYmVjYXVzZSB0aGVyZSBhcmUgdGhyZWUgY2hhbm5lbCBwb3NpdGlvbnMgaW4gZmlyc3QgY2hhbm5lbCBncm91cC4gKi8KICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDEgKSAgIC8qIE9ubHkgZnJvbnQgY2hhbm5lbHMgc3VwcG9ydGVkLiAqLwogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgICggMiApICAgLyogVGhlIG1heGltdW0gb3ZlciBhbGwgY2hhbm5lbCBncm91cHMgKi8KI2VuZGlmCiNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPiBQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMpCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTICBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUwojZWxzZQogI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTCiNlbmRpZgoKLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KI2RlZmluZSBQQ01ETVhfTElCX1ZMMCAyCiNkZWZpbmUgUENNRE1YX0xJQl9WTDEgNAojZGVmaW5lIFBDTURNWF9MSUJfVkwyIDIKI2RlZmluZSBQQ01ETVhfTElCX1RJVExFICJQQ00gRG93bm1peCBMaWIiCiNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9EQVRFIF9fREFURV9fCiNkZWZpbmUgUENNRE1YX0xJQl9CVUlMRF9USU1FIF9fVElNRV9fCgoKLyogRml4ZWQgYW5kIHVuaXF1ZSBjaGFubmVsIGdyb3VwIGluZGljZXMuCiAqIFRoZSBsYXN0IGdyb3VwIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMuICovCiNkZWZpbmUgQ0hfR1JPVVBfRlJPTlQgKCAwICkKI2RlZmluZSBDSF9HUk9VUF9TSURFICAoIDEgKQojZGVmaW5lIENIX0dST1VQX1JFQVIgICggMiApCiNkZWZpbmUgQ0hfR1JPVVBfTEZFICAgKCAzICkKCi8qIFRoZSBvcmRlcmluZyBvZiB0aGUgZm9sbG93aW5nIGZpeGVkIGNoYW5uZWwgbGFiZWxzIGhhcyB0byBiZSBpbiBNUEVHLTQgc3R5bGUuCiAqIEZyb20gdGhlIGNlbnRlciB0byB0aGUgYmFjayB3aXRoIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgaW50ZXJsZWF2ZWQgKHN0YXJ0aW5nIHdpdGggbGVmdCkuCiAqIFRoZSBsYXN0IGNoYW5uZWwgbGFiZWwgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiBQQ01fRE1YX01BWF9DSEFOTkVMUy4gKi8KI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTCAgICAoIDAgKSAgICAgLyogQyAgKi8KI2RlZmluZSBMRUZUX0ZST05UX0NIQU5ORUwgICAgICAoIDEgKSAgICAgLyogTCAgKi8KI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMICAgICAoIDIgKSAgICAgLyogUiAgKi8KI2RlZmluZSBMRUZUX1JFQVJfQ0hBTk5FTCAgICAgICAoIDMgKSAgICAgLyogTHIgKGFrYSBsZWZ0IGJhY2sgY2hhbm5lbCkgb3IgY2VudGVyIGJhY2sgY2hhbm5lbCAqLwojZGVmaW5lIFJJR0hUX1JFQVJfQ0hBTk5FTCAgICAgICggNCApICAgICAvKiBSciAoYWthIHJpZ2h0IGJhY2sgY2hhbm5lbCkgKi8KI2RlZmluZSBMT1dfRlJFUVVFTkNZX0NIQU5ORUwgICAoIDUgKSAgICAgLyogTGYgKi8KI2RlZmluZSBMRUZUX01VTFRJUFJQU19DSEFOTkVMICAoIDYgKSAgICAgLyogTGVmdCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLwojZGVmaW5lIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICggNyApICAgICAvKiBSaWdodCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLwoKLyogTW9yZSBjb25zdGFudHMgKi8KI2RlZmluZSBPTkVfQ0hBTk5FTCAgICAgICAgICAgICAoIDEgKQojZGVmaW5lIFRXT19DSEFOTkVMICAgICAgICAgICAgICggMiApCiNkZWZpbmUgU0lYX0NIQU5ORUwgICAgICAgICAgICAgKCA2ICkKI2RlZmluZSBFSUdIVF9DSEFOTkVMICAgICAgICAgICAoIDggKQoKI2RlZmluZSBQQ01ETVhfQV9JRFhfREVGQVVMVCAgICAoIDIgKQojZGVmaW5lIFBDTURNWF9CX0lEWF9ERUZBVUxUICAgICggMiApCiNkZWZpbmUgUENNRE1YX0xGRV9JRFhfREVGQVVMVCAgKCAxNSApCiNkZWZpbmUgUENNRE1YX0dBSU5fNV9ERUZBVUxUICAgKCAwICkKI2RlZmluZSBQQ01ETVhfR0FJTl8yX0RFRkFVTFQgICAoIDAgKQoKI2RlZmluZSBQQ01ETVhfTUFYX0hFQURST09NICAgICAoIDMgKSAgICAgLyogRGVmaW5lcyB0aGUgbWF4aW11bSBQQ00gc2NhbGluZyBoZWFkcm9vbSB0aGF0IGNhbiBiZSBkb25lIGJ5IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2Nlc3Npbmcgc3RlcC4gVGhpcyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4gKi8KCiNkZWZpbmUgRkFMU0UgIDAKI2RlZmluZSBUUlVFICAgMQojZGVmaW5lIElOICAgICAwCiNkZWZpbmUgT1VUICAgIDEKCi8qIFR5cGUgZGVmaW5pdGlvbnM6ICovCiNpZm5kZWYgRE1YX0hJR0hfUFJFQ0lTSU9OX0VOQUJMRQogI2RlZmluZSBGSVhQX0RNWCAgICAgICAgICBGSVhQX1NHTAogI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoeCkpCiAjZGVmaW5lIEZYX0RCTDJGWF9ETVgoeCkgIEZYX0RCTDJGWF9TR0woeCkKICNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9TR0woeCkKICNkZWZpbmUgTUFYVkFMX0RNWCAgICAgICAgTUFYVkFMX1NHTAogI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAgICAoKFNIT1JUKSh4KSkKICNkZWZpbmUgRlhfRE1YMkZMKHgpICAgICAgRlhfREJMMkZMKEZYX0RNWDJGWF9EQkwoeCkpCiNlbHNlCiAjZGVmaW5lIEZJWFBfRE1YICAgICAgICAgIEZJWFBfREJMCiAjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgICgoRklYUF9EQkwpKHgpKQogI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpICAoKEZJWFBfREJMKSh4KQogI2RlZmluZSBGTDJGWENPTlNUX0RNWCh4KSBGTDJGWENPTlNUX0RCTCh4KQogI2RlZmluZSBNQVhWQUxfRE1YICAgICAgICBNQVhWQUxfREJMCiAjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICAgICgoU0hPUlQpKCh4KT4+RlJBQ1RfQklUUykpCiAjZGVmaW5lIEZYX0RNWDJGTCh4KSAgICAgIEZYX0RCTDJGTCh4KQojZW5kaWYKCi8qIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcG9zaXRpb25zIGZvciBlYWNoIGdyb3VwIGluIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KICogU2VlIHRoZSBjaGFubmVsIGxhYmVscyBhYm92ZS4gKi8Kc3RhdGljIGNvbnN0IFVDSEFSIG1heENoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdID0gewojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKICAzLCAwLCAyLCAxCiNlbHNlCiAgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQCiNlbmRpZgp9OwoKLyogTGlzdCBvZiBwYWNrZWQgY2hhbm5lbCBtb2RlcyAqLwp0eXBlZGVmIGVudW0KeyAvKiBDSF9NT0RFXzxudW1Gcm9udENoPl88bnVtU2lkZUNoPl88bnVtQmFja0NoPl88bnVtTGZDaD4gKi8KICBDSF9NT0RFX1VOREVGSU5FRCA9IDB4MDAwMCwKICAvKiAxIGNoYW5uZWwgKi8KICBDSF9NT0RFXzFfMF8wXzAgICA9IDB4MDAwMSwgICAvKiBjaENmZyAxICovCiAgLyogMiBjaGFubmVscyAqLwogIENIX01PREVfMl8wXzBfMCAgID0gMHgwMDAyLCAgIC8qIGNoQ2ZnIDIgKi8KICAvKiAzIGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMF8wICAgPSAweDAwMDMsICAgLyogY2hDZmcgMyAqLwogIENIX01PREVfMl8wXzFfMCAgID0gMHgwMTAyLAogIENIX01PREVfMl8wXzBfMSAgID0gMHgxMDAyLAogIC8qIDQgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8xXzAgICA9IDB4MDEwMywgICAvKiBjaENmZyA0ICovCiAgQ0hfTU9ERV8yXzBfMl8wICAgPSAweDAyMDIsCiAgQ0hfTU9ERV8yXzBfMV8xICAgPSAweDExMDIsCiAgQ0hfTU9ERV80XzBfMF8wICAgPSAweDAwMDQsCiAgLyogNSBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMCAgID0gMHgwMjAzLCAgIC8qIGNoQ2ZnIDUgKi8KICBDSF9NT0RFXzJfMF8yXzEgICA9IDB4MTIwMiwKICBDSF9NT0RFXzNfMF8xXzEgICA9IDB4MTEwMywKICBDSF9NT0RFXzNfMl8wXzAgICA9IDB4MDAyMywKICBDSF9NT0RFXzVfMF8wXzAgICA9IDB4MDAwNSwKICAvKiA2IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8xICAgPSAweDEyMDMsICAgLyogY2hDZmcgNiAqLwogIENIX01PREVfM18yXzBfMSAgID0gMHgxMDIzLAogIENIX01PREVfM18yXzFfMCAgID0gMHgwMTIzLAogIENIX01PREVfNV8wXzFfMCAgID0gMHgwMTA1LAogIENIX01PREVfNl8wXzBfMCAgID0gMHgwMDA2LAogIC8qIDcgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzJfMl8yXzEgICA9IDB4MTIyMiwKICBDSF9NT0RFXzNfMF8zXzEgICA9IDB4MTMwMywgICAvKiBjaENmZyAxMSAqLwogIENIX01PREVfM18yXzFfMSAgID0gMHgxMTIzLAogIENIX01PREVfM18yXzJfMCAgID0gMHgwMjIzLAogIENIX01PREVfM18wXzJfMiAgID0gMHgyMjAzLAogIENIX01PREVfNV8wXzJfMCAgID0gMHgwMjA1LAogIENIX01PREVfNV8wXzFfMSAgID0gMHgxMTA1LAogIENIX01PREVfN18wXzBfMCAgID0gMHgwMDA3LAogIC8qIDggY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMl8yXzEgICA9IDB4MTIyMywKICBDSF9NT0RFXzNfMF80XzEgICA9IDB4MTQwMywgICAvKiBjaENmZyAxMiAqLwogIENIX01PREVfNV8wXzJfMSAgID0gMHgxMjA1LCAgIC8qIGNoQ2ZnIDcgKyAxNCAqLwogIENIX01PREVfNV8yXzFfMCAgID0gMHgwMTI1LAogIENIX01PREVfM18yXzFfMiAgID0gMHgyMTIzLAogIENIX01PREVfMl8yXzJfMiAgID0gMHgyMjIyLAogIENIX01PREVfM18wXzNfMiAgID0gMHgyMzAzLAogIENIX01PREVfOF8wXzBfMCAgID0gMHgwMDA4Cgp9IFBDTV9ETVhfQ0hBTk5FTF9NT0RFOwoKCi8qIFRoZXNlIGFyZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyBsaW5rZWQgdG8KICAgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgZ2l2ZSBieSB0aGUgdXNlcjogKi8Kc3RhdGljIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFIG91dENoTW9kZVRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTKzFdID0KewogIENIX01PREVfVU5ERUZJTkVELAogIENIX01PREVfMV8wXzBfMCwgIC8qIDEgY2hhbm5lbCAgKi8KICBDSF9NT0RFXzJfMF8wXzAsICAvKiAyIGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMF8wICAgLyogMyBjaGFubmVscyAqLwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKICxDSF9NT0RFXzNfMF8xXzAsICAvKiA0IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8wLCAgLyogNSBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMSwgIC8qIDYgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8zXzEsICAvKiA3IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfNF8xICAgLyogOCBjaGFubmVscyAqLwojZW5kaWYKfTsKCnN0YXRpYyBjb25zdCBGSVhQX0RNWCBhYk1peEx2bFZhbHVlVGFiWzhdID0KewogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogc2NhbGVkIGJ5IDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLAogIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksCiAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwKICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLAogIEZMMkZYQ09OU1RfRE1YKDAuNDIyZiksCiAgRkwyRlhDT05TVF9ETVgoMC4zNTVmKSwKICBGTDJGWENPTlNUX0RNWCgwLjBmKQp9OwoKc3RhdGljIGNvbnN0IEZJWFBfRE1YIGxmZU1peEx2bFZhbHVlVGFiWzE2XSA9CnsgLyogICAgICAgICAgICAgdmFsdWUsICAgICAgICBzY2FsZSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNzkwNWYpLCAgLyogICAgIDIgKi8KICBGTDJGWENPTlNUX0RNWCgwLjUwMDBmKSwgIC8qICAgICAyICovCiAgRkwyRlhDT05TVF9ETVgoMC44Mzk1ZiksICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNzA2NWYpLCAgLyogICAgIDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjU5NDVmKSwgIC8qICAgICAxICovCiAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuODQxZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjMxNmYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4xNzhmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMTAwZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjAzMmYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4wMTBmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMDAwZikgICAgLyogICAgIDAgKi8KfTsKCgoKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAvKiBNUEVHIG1hdHJpeCBtaXhkb3duOgogICAgICBTZXQgMTogIEwnID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgKyBBICogTHNdOwogICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogUnNdOwoKICAgICAgU2V0IDI6ICBMJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSAtIEEgKiAoTHMgKyBScyldOwogICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIChMcyArIFJzKV07CgogICAgICBNID0gKDMgKyAyQSleLTEgKiBbTCArIEMgKyBSICsgQSooTHMgKyBScyldOwogICovCiAgc3RhdGljIGNvbnN0IEZJWFBfRE1YIG1wZWdNaXhEb3duSWR4MkNvZWZbNF0gPQogIHsKICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zNTM1NTMzOWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4wZikKICB9OwoKICBzdGF0aWMgY29uc3QgRklYUF9TR0wgbXBlZ01peERvd25JZHgyUHJlRmFjdFszXVs0XSA9CiAgeyB7ICAvKiBTZXQgMTogKi8KICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC40NTMwODE4MzkzMjE5NzI4ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjQ4NTI4MTM3NDIzODU3MDNmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCiAgfSx7ICAvKiBTZXQgMjogKi8KICAgIEZMMkZYQ09OU1RfRE1YKDAuMzIwMzc3MjQxMDE3MDQwN2YpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zNjkzOTgwNjI1MTgxMjkzZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCiAgfSx7ICAvKiBNb25vIERNWCBzZXQ6ICovCiAgICBGTDJGWENPTlNUX0RNWCgwLjIyNjU0MDkxOTY2MDk4NjRmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMjVmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMjY5NzUyMTQzMzg5ODE3OWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zMzMzMzMzMzMzMzMzMzMzZikgfQogIH07CiNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwoKCiNkZWZpbmUgVFlQRV9OT05FICAgICAgKCAweDAgKQojZGVmaW5lIFRZUEVfRFNFX0RBVEEgICggMHgxICkKI2RlZmluZSBUWVBFX1BDRV9EQVRBICAoIDB4MiApCgp0eXBlZGVmIHN0cnVjdAp7CiAgVUlOVCAgIHR5cGVGbGFnczsKICAvKiBGcm9tIERTRSAqLwogIFVDSEFSICBjTGV2SWR4OwogIFVDSEFSICBzTGV2SWR4OwogIFVDSEFSICBkbWl4SWR4QTsKICBVQ0hBUiAgZG1peElkeEI7CiAgVUNIQVIgIGRtaXhJZHhMZmU7CiAgVUNIQVIgIGRteEdhaW5JZHgyOwogIFVDSEFSICBkbXhHYWluSWR4NTsKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAvKiBGcm9tIFBDRSAqLwogIFVDSEFSICBtYXRyaXhNaXhkb3duSWR4OwojZW5kaWYKICAvKiBBdHRyaWJ1dGVzOiAqLwogIFNDSEFSICBwc2V1ZG9TdXJyb3VuZDsgICAgICAgICAgICAgICAvKiE8IElmIHNldCB0byAxIHRoZSBzaWduYWwgaXMgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUuIFRoZSB2YWx1ZSAwIHRlbGxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBpcyBub3QuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gICovCiAgVUlOVCAgIGV4cGlyeUNvdW50OyAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB0byBtb25pdG9yIHRoZSBsaWZlIHRpbWUgb2YgYSBtZXRhIGRhdGEgc2V0LiAqLwoKfSBETVhfQlNfTUVUQV9EQVRBOwoKLyogRGVmYXVsdCBtZXRhZGF0YSAqLwpzdGF0aWMgY29uc3QgRE1YX0JTX01FVEFfREFUQSAgZGZsdE1ldGFEYXRhID0gewogIDAsIDIsIDIsIDIsIDIsIDE1LCAwLCAwLAojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogIDAsCiNlbmRpZgogIC0xLCAwCn07CgovKiBEeW5hbWljICh1c2VyKSBwYXJhbXM6CiAgICAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIFBDTURNWF9QQVJBTSBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMgZmllbGRzLiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgVUlOVCAgIGV4cGlyeUZyYW1lOyAgICAgICAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUgICAgICAgKi8KICBEVUFMX0NIQU5ORUxfTU9ERSBkdWFsQ2hhbm5lbE1vZGU7ICAgIC8qITwgTGlua2VkIHRvIERNWF9EVUFMX0NIQU5ORUxfTU9ERSAgICAgICAgICAqLwogIFBTRVVET19TVVJST1VORF9NT0RFIHBzZXVkb1N1cnJNb2RlOyAgLyohPCBMaW5rZWQgdG8gRE1YX1BTRVVET19TVVJST1VORF9NT0RFICAgICAgICovCiAgU0hPUlQgIG51bU91dENoYW5uZWxzTWluOyAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KICBTSE9SVCAgbnVtT3V0Q2hhbm5lbHNNYXg7ICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLwogIFVDSEFSICBmcmFtZURlbGF5OyAgICAgICAgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfREVMQVkgICAgICAgICAgICAgICovCgp9IFBDTV9ETVhfVVNFUl9QQVJBTVM7CgovKiBNb2R1bGVzIG1haW4gZGF0YSBzdHJ1Y3R1cmU6ICovCnN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFCnsKICAvKiBNZXRhZGF0YSAqLwogIERNWF9CU19NRVRBX0RBVEEgICAgIGJzTWV0YURhdGFbUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTKzFdOwogIFBDTV9ETVhfVVNFUl9QQVJBTVMgIHVzZXJQYXJhbXM7CgogIFVDSEFSICBhcHBseVByb2Nlc3Npbmc7ICAgICAgICAgICAgICAvKiE8IEZsYWcgdG8gZW4tL2Rpc2FibGUgbW9kdWxlcyBwcm9jZXNzaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggY2hhbm5lbCBsaW1pdGluZyBpcyBkb25lIGluZGVwZW5kZW50bHkuICovCn07CgovKiBNZW1vcnkgYWxsb2NhdGlvbiBtYWNybyAqLwpDX0FMTE9DX01FTV9TVEFUSUMoUGNtRG14SW5zdGFuY2UsIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFLCAxKQoKCi8qKiBFdmFsdWF0ZSBhIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZXh0cmFjdCBhIHBhY2tlZCBjaGFubmVsIG1vZGUuIEluIGFkZGl0aW9uIHRoZQogKiAgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgZm9yIHRoZSBtYXBwaW5nIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxEZXNjcmlwdGlvbigpIHJvdXRpbmUuCiAqIEBwYXJhbSBbaW5dIFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCiAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVsLgogKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoIGNoYW5uZWwuCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbb3V0XSBUaGUgZ2VuZXJhdGVkIHBhY2tlZCBjaGFubmVsIG1vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBpbnB1dCBjb25maWd1cmF0aW9uLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8Kc3RhdGljClBDTURNWF9FUlJPUiBnZXRDaGFubmVsTW9kZSAoCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIG9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwgICAgIC8qIG91dCAqLwogICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICAgICpjaE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgKQp7CiAgVUNIQVIgY2hJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUF07CiAgVUNIQVIgbnVtQ2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107IC8qIFRvdGFsIG51bSBvZiBjaGFubmVscyBwZXIgZ3JvdXAgb2YgdGhlIGlucHV0IGNvbmZpZyAqLwogIFVDSEFSIG51bUNoRnJlZVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107ICAvKiBOdW1iZXIgb2YgZnJlZSBzbG90cyBwZXIgZ3JvdXAgaW4gdGhlIGludGVybmFsIHJlcHIuICovCiAgVUNIQVIgaGFyZFRvUGxhY2VbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOyAgICAgIC8qIExpc3Qgb2YgY2hhbm5lbHMgbm90IG1hdGNoaW5nIHRoZSBpbnRlcm5hbCByZXByLiAqLwogIFVDSEFSIGgycFNvcnRJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7CiAgaW50ICAgY2gsIGdycElkeDsKICBpbnQgICBudW1DaFRvUGxhY2UgPSAwOwoKICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoTW9kZSAhPSBOVUxMKTsKCiAgLyogRm9yIGRldGFpbHMgc2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMyBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KICBGREttZW1jbGVhcihudW1DaEluR3JwLCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQob2Zmc2V0VGFibGUsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KGNoSWR4LCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCpzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQoaGFyZFRvUGxhY2UsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KGgycFNvcnRJZHgsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgLyogR2V0IHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCiAgRkRLbWVtY3B5KG51bUNoRnJlZSwgbWF4Q2hJbkdycCwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqc2l6ZW9mKFVDSEFSKSk7CgogICpjaE1vZGUgPSBDSF9NT0RFX1VOREVGSU5FRDsKCiAgLyogQ2F0ZWdvcml6ZSBjaGFubmVscyAqLwogIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CiAgICBVQ0hBUiBjaEdycElkeCA9IGNoYW5uZWxJbmRpY2VzW2NoXTsKICAgIGludCBpID0gMCwgajsKCiAgICBzd2l0Y2ggKGNoYW5uZWxUeXBlW2NoXSkgewogICAgY2FzZSBBQ1RfRlJPTlRfVE9QOgogICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXTsgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KICAgIGNhc2UgQUNUX0ZST05UOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9GUk9OVDsKICAgICAgYnJlYWs7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgY2FzZSBBQ1RfU0lERV9UT1A6CiAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV07ICAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwogICAgY2FzZSBBQ1RfU0lERToKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfU0lERTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFDVF9CQUNLX1RPUDoKICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXTsgICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCiAgICBjYXNlIEFDVF9CQUNLOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9SRUFSOwogICAgICBicmVhazsKICAgIGNhc2UgQUNUX0xGRToKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfTEZFOwogICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICAvKiBGb3VuZCBhIGNoYW5uZWwgdGhhdCBjYW4gbm90IGJlIGNhdGVnb3JpemVkISBNb3N0IGxpa2VseSBkdWUgdG8gY29ycnVwdCBpbnB1dCBzaWduYWxsaW5nLgogICAgICAgICBUaGUgcmVzY3VlIHN0cmF0ZWd5IGlzIHRvIGFwcGVuZCBpdCB0byB0aGUgZnJvbnQgY2hhbm5lbHMgKD0+IGlnbm9yZSBpbmRleCkuCiAgICAgICAgIFRoaXMgY291bGQgY2F1c2Ugc3RyYW5nZSBiZWhhdmlvdXIgc28gcmV0dXJuIGFuIGVycm9yIHRvIHNpZ25hbCBpdC4gKi8KICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfRlJPTlQ7CiAgICAgIGNoR3JwSWR4ID0gbnVtQ2hhbm5lbHMgKyBudW1DaFRvUGxhY2U7CiAgICAgIG51bUNoVG9QbGFjZSArPSAxOwogICAgICBicmVhazsKICAgIH0KCiAgICBpZiAobnVtQ2hJbkdycFtncnBJZHhdIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQKSB7CiAgICAgIC8qIFNvcnQgY2hhbm5lbHMgYnkgaW5kZXggKi8KICAgICAgd2hpbGUgKCAoaSA8IG51bUNoSW5HcnBbZ3JwSWR4XSkgJiYgKGNoR3JwSWR4ID4gY2hhbm5lbEluZGljZXNbY2hJZHhbZ3JwSWR4XVtpXV0pICkgewogICAgICAgIGkgKz0gMTsKICAgICAgfQogICAgICBmb3IgKGogPSBudW1DaEluR3JwW2dycElkeF07IGogPiBpOyBqIC09IDEpIHsKICAgICAgICBjaElkeFtncnBJZHhdW2pdID0gY2hJZHhbZ3JwSWR4XVtqLTFdOwogICAgICB9CiAgICAgIGNoSWR4W2dycElkeF1baV0gPSBjaDsKICAgICAgbnVtQ2hJbkdycFtncnBJZHhdICs9IDE7CiAgICB9CiAgfQoKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgRkRLX0FTU0VSVCggKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdK251bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0KICAgICAgICAgICAgICArbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXStudW1DaEluR3JwW0NIX0dST1VQX0xGRV0pID09IG51bUNoYW5uZWxzKTsKI2Vsc2UKICBGREtfQVNTRVJUKCBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSA9PSBudW1DaGFubmVscyApOwojZW5kaWYKCiAgLyogQ29tcG9zZSBjaGFubmVsIG9mZnNldCB0YWJsZToKICAgKiBNYXAgYWxsIGNoYW5uZWxzIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gKi8KICBudW1DaFRvUGxhY2UgPSAwOwoKICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCiAgaWYgKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB7CiAgICAvKiBPZGQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzIC0+IHdlIGhhdmUgYSBjZW50ZXIgY2hhbm5lbC4KICAgICAgIEluIE1QRUctNCB0aGUgY2VudGVyIGhhcyB0aGUgaW5kZXggMC4gKi8KICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IGNoSWR4W0NIX0dST1VQX0ZST05UXVswXTsKICAgIG51bUNoRnJlZVtDSF9HUk9VUF9GUk9OVF0gLT0gMTsKICB9CgogIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7CiAgICBpbnQgY2hNYXBQb3MgPSAwOwogICAgY2ggPSAwOyAgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCgogICAgc3dpdGNoIChncnBJZHgpIHsKICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6CiAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOwogICAgICBjaCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKICAgICAgYnJlYWs7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgY2FzZSBDSF9HUk9VUF9TSURFOgogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTDsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX0dST1VQX0xGRToKICAgICAgY2hNYXBQb3MgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CiAgICAgIGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgb2YgdGhlIGdyb3VwICovCiAgICBmb3IgKCA7IGNoIDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaCArPSAxKSB7CiAgICAgIGlmIChudW1DaEZyZWVbZ3JwSWR4XSA+IDApIHsKICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKICAgICAgICBjaE1hcFBvcyArPSAxOwogICAgICAgIG51bUNoRnJlZVtncnBJZHhdIC09IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogQWRkIHRvIHRoZSBsaXN0IG9mIGhhcmRzaGlwIGNhc2VzIGNvbnNpZGVyaW5nIGEgTVBFRy1saWtlIHNvcnRpbmcgb3JkZXI6ICovCiAgICAgICAgaW50IHBvcywgc29ydElkeCA9IGdycElkeCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaGFubmVsSW5kaWNlc1tjaElkeFtncnBJZHhdW2NoXV07CiAgICAgICAgZm9yIChwb3MgPSBudW1DaFRvUGxhY2U7IHBvcyA+IDA7IHBvcyAtPSAxKSB7CiAgICAgICAgICBpZiAoaDJwU29ydElkeFtwb3MtMV0gPiBzb3J0SWR4KSB7CiAgICAgICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBoYXJkVG9QbGFjZVtwb3MtMV07CiAgICAgICAgICAgIGgycFNvcnRJZHhbcG9zXSA9IGgycFNvcnRJZHhbcG9zLTFdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogSW5zZXJ0IGNoYW5uZWwgYXQgdGhlIGN1cnJlbnQgaW5kZXgvcG9zaXRpb24gKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKICAgICAgICBoMnBTb3J0SWR4W3Bvc10gPSBzb3J0SWR4OwogICAgICAgIG51bUNoVG9QbGFjZSArPSAxOwogICAgICB9CiAgICB9CiAgfQoKICB7IC8qIEFzc2lnbiB0aGUgaGFyZHNoaXAgY2FzZXMgKi8KICAgIGludCBjaE1hcFBvcyA9IDA7CiAgICBpbnQgbWFwcGluZ0hlYXQgPSAwOwogICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hUb1BsYWNlOyBjaCs9MSkgewogICAgICBpbnQgY2hBc3NpZ25lZCA9IDA7CgogICAgICAvKiBKdXN0IGFzc2lnbmluZyB0aGUgY2hhbm5lbHMgdG8gdGhlIG5leHQgYmVzdCBzbG90IGNhbiBsZWFkIHRvIHVuZGVzaXJlZCByZXN1bHRzIChlc3BlY2lhbGx5IGZvciB4L3gvMS54CiAgICAgICAgIGNvbmZpZ3VyYXRpb25zKS4gVGh1cyB1c2UgdGhlIE1QRUctbGlrZSBzb3J0aW5nIGluZGV4IHRvIGZpbmQgdGhlIGJlc3QgZml0dGluZyBzbG90IGZvciBlYWNoIGNoYW5uZWwuCiAgICAgICAgIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIHRoZSBzb3J0aW5nIGluZGV4IHdpbGwgYmUgaWdub3JlZCAobWFwcGluZ0hlYXQgPj0gMikuICovCiAgICAgIGZvciAoIDsgY2hNYXBQb3MgPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2hNYXBQb3MrPTEpIHsKICAgICAgICBpZiAob2Zmc2V0VGFibGVbY2hNYXBQb3NdID09IDI1NSkgewogICAgICAgICAgaW50IHBydlNvcnRJZHggPSAwOwogICAgICAgICAgaW50IG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKCiAgICAgICAgICBpZiAobWFwcGluZ0hlYXQgPCAyKSB7CiAgICAgICAgICAgIGlmIChjaE1hcFBvcyA8IExFRlRfUkVBUl9DSEFOTkVMKSB7CiAgICAgICAgICAgICAgLyogR290IGZyb250IGNoYW5uZWwgc2xvdCAqLwogICAgICAgICAgICAgIHBydlNvcnRJZHggPSBDSF9HUk9VUF9GUk9OVCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIENFTlRFUl9GUk9OVF9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9TSURFICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2hNYXBQb3MgPCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwpIHsKICAgICAgICAgICAgICAvKiBHb3QgYmFjayBjaGFubmVsIHNsb3QgKi8KICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gQ0hfR1JPVVBfUkVBUipQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIExFRlRfUkVBUl9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9MRkUgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjaE1hcFBvcyA8IExFRlRfTVVMVElQUlBTX0NIQU5ORUwpIHsKICAgICAgICAgICAgICAvKiBHb3QgbGZlIGNoYW5uZWwgc2xvdCAqLwogICAgICAgICAgICAgIHBydlNvcnRJZHggPSAgQ0hfR1JPVVBfTEZFICAgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8qIEFzc2lnbiB0aGUgY2hhbm5lbCBvbmx5IGlmIGl0cyBzb3J0IGluZGV4IGlzIHdpdGhpbiB0aGUgcmFuZ2UgKi8KICAgICAgICAgIGlmICggKGgycFNvcnRJZHhbY2hdID49IHBydlNvcnRJZHgpCiAgICAgICAgICAgICYmIChoMnBTb3J0SWR4W2NoXSA8ICBueHRTb3J0SWR4KSApIHsKICAgICAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3MrK10gPSBoYXJkVG9QbGFjZVtjaF07CiAgICAgICAgICAgIGNoQXNzaWduZWQgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoQXNzaWduZWQgPT0gMCkgewogICAgICAgIGNoTWFwUG9zID0gMDsKICAgICAgICBjaCAtPSAxOwogICAgICAgIG1hcHBpbmdIZWF0ICs9IDE7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICB9CgogIC8qIENvbXBvc2UgdGhlIGNoYW5uZWwgbW9kZSAqLwogICpjaE1vZGUgPSAoUENNX0RNWF9DSEFOTkVMX01PREUpKCAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweEYpCiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgJiAweEYpIDw8ICA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICAmIDB4RikgPDwgIDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgICYgMHhGKSA8PCAxMgojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogIHJldHVybiBlcnI7Cn0KCgovKiogR2VuZXJhdGUgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBhbmQgY29tcGxldGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiAocGFja2VkKSBjaGFubmVsIG1vZGUuCiAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsTW9kZSgpIHJvdXRpbmUgYnV0IGRvZXMgbm90IHN1cHBvcnQgd2VpcmQgY2hhbm5lbAogKiAgY29uZmlndXJhdGlvbnMuIEFsbCBjaGFubmVscyBoYXZlIHRvIGJlIGluIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyIGFuZCB0aGVyZSBtdXN0IG5vdCBiZSBtb3JlCiAqICBjaGFubmVscyBpbiBlYWNoIGdyb3VwIHRoYW4gZ2l2ZW4gYnkgbWF4Q2hJbkdycC4KICogQHBhcmFtIFtpbl0gVGhlIHBhY2tlZCBjaGFubmVsIG1vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgogKiBAcGFyYW0gW2luXSBBcnJheSBjb250YWluaW5nIHRoZSBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbHMgYXJlIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEByZXR1cm5zIE5vbmUuCiAqKi8Kc3RhdGljCnZvaWQgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uICgKICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgY2hNb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgICAgICBjaGFubmVsVHlwZVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdICAgICAgIC8qIG91dCAqLwogICAgICApCnsKICBjb25zdCBVQ0hBUiAqcENoYW5uZWxNYXA7CiAgaW50ICAgZ3JwSWR4LCBjaCA9IDAsIG51bUNoYW5uZWxzID0gMDsKICBVQ0hBUiBudW1DaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsKCiAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hhbm5lbE1hcHBpbmcgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKCiAgLyogSW5pdCBvdXRwdXQgYXJyYXlzICovCiAgRkRLbWVtY2xlYXIoY2hhbm5lbFR5cGUsICAgIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKICBGREttZW1jbGVhcihjaGFubmVsSW5kaWNlcywgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwoKICAvKiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGdyb3VwICovCiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPSAgY2hNb2RlICAgICAgICAmIDB4RjsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgPSAoY2hNb2RlID4+ICA0KSAmIDB4RjsKICBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICA9IChjaE1vZGUgPj4gIDgpICYgMHhGOwogIG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgID0gKGNoTW9kZSA+PiAxMikgJiAweEY7CiNlbmRpZgoKICAvKiBTdW1tZXJpemUgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewogICAgbnVtQ2hhbm5lbHMgKz0gbnVtQ2hJbkdycFtncnBJZHhdOwogIH0KCiAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIG1hcCAqLwogIHN3aXRjaCAoY2hNb2RlKSB7CiAgY2FzZSBDSF9NT0RFXzFfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nW251bUNoYW5uZWxzXTsKICAgIGJyZWFrOwogIGNhc2UgQ0hfTU9ERV8zXzBfM18xOgogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1sxMV07CiAgICBicmVhazsKICBjYXNlIENIX01PREVfM18wXzRfMToKICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMTJdOwogICAgYnJlYWs7CiAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzddOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qIGZhbGxiYWNrICovCiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzBdOwogICAgYnJlYWs7CiAgfQoKICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlICovCgogIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KICBpZiAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHsKICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgogICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLwogICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1hcHBlZElkeDsKICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gICAgPSBBQ1RfRlJPTlQ7CiAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gMDsKICAgIGNoICs9IDE7CiAgfQoKICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewogICAgQVVESU9fQ0hBTk5FTF9UWVBFIHR5cGUgPSBBQ1RfTk9ORTsKICAgIGludCBjaE1hcFBvcyA9IDAsIG1heENoYW5uZWxzID0gMDsKICAgIGludCBjaElkeCA9IDA7ICAvKiBJbmRleCBvZiBjaGFubmVsIHdpdGhpbiB0aGUgc3BlY2lmaWMgZ3JvdXAgKi8KCiAgICBzd2l0Y2ggKGdycElkeCkgewogICAgY2FzZSBDSF9HUk9VUF9GUk9OVDoKICAgICAgdHlwZSA9IEFDVF9GUk9OVDsKICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CiAgICAgIG1heENoYW5uZWxzID0gMzsKICAgICAgY2hJZHggPSBudW1DaEluR3JwW2dycElkeF0gJiAweDE7CiAgICAgIGJyZWFrOwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICAgIGNhc2UgQ0hfR1JPVVBfU0lERToKICAgICAgLyogQWx3YXlzIG1hcCBzaWRlIGNoYW5uZWxzIHRvIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAuICovCiAgICAgIHR5cGUgPSBBQ1RfU0lERTsKICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKICAgICAgdHlwZSA9IEFDVF9CQUNLOwogICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOwogICAgICBtYXhDaGFubmVscyA9IDI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9HUk9VUF9MRkU6CiAgICAgIHR5cGUgPSBBQ1RfTEZFOwogICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKICAgICAgbWF4Q2hhbm5lbHMgPSAxOwogICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBNYXAgYWxsIGNoYW5uZWxzIGluIHRoaXMgZ3JvdXAgKi8KICAgIGZvciAoIDsgY2hJZHggPCBudW1DaEluR3JwW2dycElkeF07IGNoSWR4ICs9IDEpIHsKICAgICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKICAgICAgaWYgKGNoSWR4ID09IG1heENoYW5uZWxzKSB7CiAgICAgICAgLyogTm8gc3BhY2UgbGVmdCBpbiB0aGlzIGNoYW5uZWwgZ3JvdXAhCiAgICAgICAgICAgVXNlIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAgaW5zdGVhZDogKi8KICAgICAgICBjaE1hcFBvcyA9IExFRlRfTVVMVElQUlBTX0NIQU5ORUw7CiAgICAgIH0KICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdICAgICA9IG1hcHBlZElkeDsKICAgICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSAgICA9IHR5cGU7CiAgICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSBjaElkeDsKICAgICAgY2hNYXBQb3MgKz0gMTsKICAgICAgY2ggKz0gMTsKICAgIH0KICB9Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgaW5pdGlhbGl6ZXMKICogIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBpbml0aWFsaXplZC4KICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCiAqKi8Kc3RhdGljCnZvaWQgZG14SW5pdENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIG91dENoCiAgICAgICApCnsKICB1bnNpZ25lZCBpbnQgaW5DaDsKICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICBpZiAoaW5DaCA9PSBvdXRDaCkgewogICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOwogICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDE7CiAgICB9IGVsc2UgewogICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuMGYpOwogICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDA7CiAgICB9CiAgfQp9CgovKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGRvZXMgYSByZXNldAogKiAgb2Ygb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGNsZWFyZWQvcmVzZXQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteENsZWFyQ2hhbm5lbCgKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgb3V0Q2gKICAgICAgICkKewogIEZES21lbWNsZWFyKCZtaXhGYWN0b3JzW291dENoXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7CiAgRkRLbWVtY2xlYXIoJm1peFNjYWxlc1tvdXRDaF0sICBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoSU5UKSk7Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgYXBwbGllcyBhIHNvdXJjZSBjaGFubmVsIChyb3cpCiAqICBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LgogKiAgRXhpc3RpbmcgbWl4IGZhY3RvcnMgb2YgdGhlIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgd2lsbCBnZXQgb3ZlcndyaXR0ZW4uCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteFNldENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCiAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQogICAgICAgKQp7CiAgaW50IGNoOwogIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgIGlmIChtaXhGYWN0b3JzW3NyY0NoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID0gRlhfREJMMkZYX0RNWChmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3RvcikpOwogICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOwogICAgfQogIH0KfQoKLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhZGRzIGEgc291cmNlIGNoYW5uZWwgKHJvdykKICogIHNjYWxlZCBieSBhIGdpdmVuIG1peCBmYWN0b3IgdG8gYSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteEFkZENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCiAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQogICAgICAgKQp7CiAgaW50IGNoOwogIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgIEZJWFBfREJMIGFkZEZhY3QgPSBmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3Rvcik7CiAgICBpZiAoYWRkRmFjdCAhPSAoRklYUF9ETVgpMCkgewogICAgICBJTlQgbmV3U2NhbGUgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOwogICAgICBpZiAobWl4RmFjdG9yc1tkc3RDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CiAgICAgICAgaWYgKG5ld1NjYWxlID4gbWl4U2NhbGVzW2RzdENoXVtjaF0pIHsKICAgICAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA+Pj0gbmV3U2NhbGUgLSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkRmFjdCA+Pj0gbWl4U2NhbGVzW2RzdENoXVtjaF0gLSBuZXdTY2FsZTsKICAgICAgICAgIG5ld1NjYWxlICA9IG1peFNjYWxlc1tkc3RDaF1bY2hdOwogICAgICAgIH0KICAgICAgfQogICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gKz0gRlhfREJMMkZYX0RNWChhZGRGYWN0KTsKICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gICA9IG5ld1NjYWxlOwogICAgfQogIH0KfQoKCi8qKiBQcml2YXRlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGRvd25taXggZmFjdG9yIG1hdHJpeCBkZXBlbmRpbmcgb24gdGhlIGlucHV0IGFuZCBvdXRwdXQKICogIGNvbmZpZ3VyYXRpb24sIHRoZSB1c2VyIHBhcmFtZXRlcnMgYXMgd2VsbCBhcyB0aGUgZ2l2ZW4gbWV0YWRhdGEuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1vZHVsZXMKICogIGJyYWluIGFuZCBob2xkIGFsbCBkb3dubWl4IGFsZ29yaXRobXMuCiAqIEBwYXJhbSBbaW5dICBGbGFnIHRoYXQgaW5kaWNhdGVzIGlmIGluQ2hNb2RlIGhvbGRzIGEgcmVhbCAocGFja2VkKSBjaGFubmVsIG1vZGUgb3IgaGFzIGJlZW4KICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBhIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXguCiAqIEBwYXJhbSBbaW5dICBEZXBlbmRlbnQgb24gdGhlIGluTW9kZUlzQ2ZnIGZsYWcgdGhpcyBmaWVsZCBoYW5kcyBpbiBhIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvcgogICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC5vZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbi4KICogQHBhcmFtIFtpbl0gIFRoZSAocGFja2VkKSBjaGFubmVsIG1vZGUgb2YgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uLgogKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgY3VycmVudCB1c2VyIHBhcmFtZXRlci4KICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gZmllbGQgaG9sZGluZyBhbGwgY3VycmVudCBtZXRhIGRhdGEuCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4gTm9ybWFsaXplZCB0byBvbmUgc2NhbGUgZmFjdG9yLgogKiBAcGFyYW0gW291dF0gVGhlIGNvbW1vbiBzY2FsZSBmYWN0b3Igb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcmV0dXJucyAgICAgQW4gZXJyb3IgY29kZS4KICoqLwpzdGF0aWMKUENNRE1YX0VSUk9SIGdldE1peEZhY3RvcnMgKAogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICBpbk1vZGVJc0NmZywKICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgICAgICAgaW5DaE1vZGUsCiAgICAgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgIG91dENoTW9kZSwKICAgICAgICBjb25zdCBQQ01fRE1YX1VTRVJfUEFSQU1TICAqcFBhcmFtcywKICAgICAgICBjb25zdCBETVhfQlNfTUVUQV9EQVRBICAgICAqcE1ldGFEYXRhLAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRTY2FsZQogICAgICApCnsKICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOwogIElOVCAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgSU5UICBtYXhTY2FsZSA9IDA7CiAgaW50ICBudW1JbkNoYW5uZWwsIG51bU91dENoYW5uZWw7CiAgdW5zaWduZWQgaW50ICBvdXRDaCwgaW5DaCwgaW5DaENmZyA9IDA7CiAgdW5zaWduZWQgaW50ICB2YWxpZFtQQ01fRE1YX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKCiAgRkRLX0FTU0VSVChwTWV0YURhdGEgICE9IE5VTEwpOwogIEZES19BU1NFUlQobWl4RmFjdG9ycyAhPSBOVUxMKTsKICAvKiBDaGVjayBvbiBhIHN1cHBvcnRlZCBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwogIEZES19BU1NFUlQoIChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8xXzBfMF8wKQogICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8yXzBfMF8wKQogICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8zXzBfMl8xKSApOwoKICBpZiAoaW5Nb2RlSXNDZmcpIHsKICAgIC8qIFdvcmthcm91bmQgZm9yIHRoZSBhbWJpZ3VpdHkgb2YgdGhlIGludGVybmFsIGNoYW5uZWwgbW9kZXMuCiAgICAgICBDb252ZXJ0IGNoYW5uZWwgY29uZmlnIHRvIGNoYW5uZWwgbW9kZTogKi8KICAgIGluQ2hDZmcgID0gKHVuc2lnbmVkIGludClpbkNoTW9kZTsKICAgIHN3aXRjaCAoaW5DaENmZykgewogICAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzoKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCiAgICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgojZW5kaWYKICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtpbkNoQ2ZnXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDExOgogICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzNfMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEyOgogICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzRfMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDc6IGNhc2UgMTQ6CiAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV81XzBfMl8xOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICB9CiAgfQoKICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgKi8KICBudW1JbkNoYW5uZWwgID0gIChpbkNoTW9kZSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA0KSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA4KSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PjEyKSYweEYpOwogIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICBudW1PdXRDaGFubmVsID0gIChvdXRDaE1vZGUmMHhGKQogICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+IDQpJjB4RikKICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PiA4KSYweEYpCiAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4xMikmMHhGKTsKCiAgLyogTVBFRyBhbW1lbmRtZW50IDQgYWthIEVUU0kgbWV0YWRhdGEgYW5kIGZhbGxiYWNrIG1vZGU6ICovCgoKICAvKiBDcmVhdGUgaWRlbnRpdHkgRE1YIG1hdHJpeDogKi8KICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICBkbXhJbml0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBvdXRDaCApOwogIH0KICBpZiAoKChpbkNoTW9kZT4+MTIpJjB4RikgPT0gMCkgewogICAgLyogQ2xlYXIgZW1wdHkgb3Igd3JvbmdseSBtYXBwZWQgaW5wdXQgY2hhbm5lbCAqLwogICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCApOwogIH0KCiAgLyogRklSU1QgU1RBR0U6ICovCiAgaWYgKG51bUluQ2hhbm5lbCA+IFNJWF9DSEFOTkVMKQogIHsgLyogQWx3YXlzIHVzZSBNUEVHIGVxdWF0aW9ucyBlaXRoZXIgd2l0aCBtZXRhIGRhdGEgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcy4gKi8KICAgIEZJWFBfRE1YICBkTWl4RmFjdEEsIGRNaXhGYWN0QjsKICAgIElOVCAgICAgICBkTWl4U2NhbGVBLCBkTWl4U2NhbGVCOwogICAgaW50ICAgICAgIGlzVmFsaWRDZmcgPSBUUlVFOwoKICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCiAgICBkTWl4RmFjdEEgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhBXTsKICAgIGRNaXhTY2FsZUEgPSAocE1ldGFEYXRhLT5kbWl4SWR4QT09MCkgPyAxIDogMDsKICAgIGRNaXhGYWN0QiAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEJdOwogICAgZE1peFNjYWxlQiA9IChwTWV0YURhdGEtPmRtaXhJZHhCPT0wKSA/IDEgOiAwOwoKICAgIC8qIENoZWNrIGlmIGlucHV0IGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAqLwogICAgc3dpdGNoIChpbkNoTW9kZSkgewogICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAgLyogY2hDZmcgMTEgKi8KICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8wOgogICAgY2FzZSBDSF9NT0RFXzNfMl8xXzE6ICAgLyogY2hDZmcgMTEgYnV0IHdpdGggc2lkZSBjaGFubmVscyAqLwogICAgICAvKiA2LjFjaDogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7ICovCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV81XzJfMV8wOgogICAgY2FzZSBDSF9NT0RFXzVfMF8xXzA6CiAgICBjYXNlIENIX01PREVfNV8wXzFfMToKICAgICAgLyogICAgICAgICBMcycgPSBDcypkbWl4X2FfaWR4OwogICAgICAgICAgICAgICAgIFJzJyA9IENzKmRtaXhfYV9pZHg7ICovCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgIC8qIGNoQ2ZnIDEyICovCiAgICAgIC8qIDcuMWNoIFN1cnJvdW5kIEJhY2s6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIExzcipkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIFJzcipkbWl4X2JfaWR4OyAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgIC8qIGNoQ2ZnIDcgfHwgMTQgKi8KICAgICAgaWYgKGluQ2hDZmcgPT0gMTQpIHsKICAgICAgICAvKiA3LjFjaCBGcm9udCBIZWlnaHQ6ICBDJyA9IEM7ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwqZG1peF9hX2lkeCArIEx2KmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSKmRtaXhfYV9pZHggKyBSdipkbWl4X2JfaWR4OyAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICB9IGVsc2UgewogICAgICAgIC8qIDcuMWNoIEZyb250OiAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgICAgICAgICBDJyA9IEMgKyAoTGMrUmMpKmRtaXhfYV9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwgKyBMYypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgUmMqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgIENBVVRJT046IEwrUiBhcmUgbm90IGF0IChNUEVHKSBpbmRleCAxKzIuICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSApOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgLyogTm90aGluZyB0byBkby4gSnVzdCB1c2UgdGhlIGlkZW50aXR5IG1hdHJpeC4gKi8KICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLwogICAgaWYgKCAoaXNWYWxpZENmZyA9PSBUUlVFKQogICAgICAmJiAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAhPSAwKSkKICAgIHsgLyogQXBwbHkgRE1YIGdhaW4gNSAqLwogICAgICBGSVhQX0RNWCBkbXhHYWluOwogICAgICBJTlQgICAgICBkbXhTY2FsZTsKICAgICAgSU5UICAgICAgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHg0MCkgPyAtMSA6IDE7CiAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHgzRjsKCiAgICAgIC8qIDEwXihkbXhfZ2Fpbl81LzgwKSAqLwogICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCggZkxkUG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduKnZhbCooTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgIC8qIEN1cnJlbnRseSBvbmx5IHBvc2l0aXZlIHNjYWxlIGZhY3RvcnMgc3VwcG9ydGVkISAqLwogICAgICBpZiAoZG14U2NhbGUgPCAwKSB7CiAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOwogICAgICAgIGRteFNjYWxlICA9ICAwOwogICAgICB9CgogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgfQoKICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLwogICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdICA9IDE7CiAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdICAgID0gMTsKICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdICAgPSAxOwogICAgdmFsaWRbTEVGVF9SRUFSX0NIQU5ORUxdICAgICA9IDE7CiAgICB2YWxpZFtSSUdIVF9SRUFSX0NIQU5ORUxdICAgID0gMTsKICAgIHZhbGlkW0xPV19GUkVRVUVOQ1lfQ0hBTk5FTF0gPSAxOwoKICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCiAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzJfMTsKICB9CgogIC8qIFNFQ09ORCBTVEFHRTogKi8KICBpZiAobnVtT3V0Q2hhbm5lbCA8PSBUV09fQ0hBTk5FTCkgewogICAgLyogQ3JlYXRlIERNWCBtYXRyaXggYWNjb3JkaW5nIHRvIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKICAgIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOiAgIC8qIGNoQ2ZnIDIgKi8KICAgICAgLyogQXBwbHkgdGhlIGR1YWwgY2hhbm5lbCBtb2RlLiAqLwogICAgICBzd2l0Y2ggKHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSkgewogICAgICBjYXNlIENIMV9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMTsKICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDE7ICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOwogICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMjsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNSVhFRF9NT0RFOiAgLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjUqQ2gxICsgMC41KkNoMjsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgIGNhc2UgU1RFUkVPX01PREU6CiAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzJfMF8xXzA6CiAgICAgIC8qIEwnID0gTCArIDAuNzA3KlM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KlM7ICovCiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18wXzBfMDogICAvKiBjaENmZyAzICovCiAgICAgIC8qIEwnID0gTCArIDAuNzA3KkM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KkM7ICovCiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfMV8wOiAgIC8qIGNoQ2ZnIDQgKi8KICAgICAgLyogTCcgPSBMICsgMC43MDcqQyArIDAuNzA3KlM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KkMgKyAwLjcwNypTOyAqLwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6ICAgLyogY2hDZmcgNSAqLwogICAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6ICAgLyogY2hDZmcgNiAqLwogICAgICAvKiBNUEVHICsgSVRVICsgRExCCiAgICAgICAgIEJ1dCBiZWNhdXNlIHRoZSBkZWZhdWx0IGRvd25taXggZXF1YXRpb25zIGFuZCBjb2VmZmljaWVudHMgYXJlIGVxdWFsIHdlIHN0aWNrIHRvIE1QRUcuICovCiAgICAgIGlmICggIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpCiAgICAgICAgfHwgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpICkKICAgICAgewogICAgICAgIEZJWFBfRE1YICBjTWl4THZsLCBzTWl4THZsLCBsTWl4THZsOwogICAgICAgIElOVCAgICAgICBjTWl4U2NhbGUsIHNNaXhTY2FsZSwgbE1peFNjYWxlOwoKICAgICAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLwogICAgICAgIGNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5jTGV2SWR4XTsKICAgICAgICBjTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5jTGV2SWR4PT0wKSA/IDEgOiAwOwogICAgICAgIHNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5zTGV2SWR4XTsKICAgICAgICBzTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5zTGV2SWR4PT0wKSA/IDEgOiAwOwogICAgICAgIGxNaXhMdmwgICA9IGxmZU1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeExmZV07CiAgICAgICAgaWYgKHBNZXRhRGF0YS0+ZG1peElkeExmZSA8PSAxKSB7CiAgICAgICAgICBsTWl4U2NhbGUgPSAyOwogICAgICAgIH0gZWxzZSBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDUpIHsKICAgICAgICAgIGxNaXhTY2FsZSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxNaXhTY2FsZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIFNldHVwIHRoZSBETVggbWF0cml4ICovCiAgICAgICAgaWYgKCAocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKQogICAgICAgICAgfHwgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQ9PTEpKSkKICAgICAgICB7IC8qIEwnID0gTCArIEMqY2xldiAtIChMcytScykqc2xldiArIExGRSpsZmxldjsKICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIChMcytScykqc2xldiArIExGRSpsZmxldjsgKi8KICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsgLyogTCcgPSBMICsgQypjbGV2ICsgTHMqc2xldiArIExGRSpsbGV2OwogICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgUnMqc2xldiArIExGRSpsbGV2OyAqLwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgIH0KCiAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KICAgICAgICBpZiAoIHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgIT0gMCApCiAgICAgICAgeyAvKiBBcHBseSBETVggZ2FpbiAyICovCiAgICAgICAgICBGSVhQX0RNWCBkbXhHYWluOwogICAgICAgICAgSU5UICAgICAgZG14U2NhbGU7CiAgICAgICAgICBJTlQgICAgICBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDQwKSA/IC0xIDogMTsKICAgICAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHgyICYgMHgzRjsKCiAgICAgICAgICAvKiAxMF4oZG14X2dhaW5fMi84MCkgKi8KICAgICAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKCBmTGRQb3coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbip2YWwqKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KICAgICAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKICAgICAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOwogICAgICAgICAgICBkbXhTY2FsZSAgPSAgMDsKICAgICAgICAgIH0KCiAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgICAgfQogICAgICB9CiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIGVsc2UgewogICAgICAgIEZJWFBfRE1YICBmbGV2LCBjbGV2LCBzbGV2TEwsIHNsZXZMUiwgc2xldlJMLCBzbGV2UlI7CiAgICAgICAgRklYUF9ETVggIG10cnhNaXhEd25Db2VmID0gbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwoKICAgICAgICBpZiAoIChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpCiAgICAgICAgICB8fCAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJiAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZD09MSkpKQogICAgICAgIHsgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNysyKkEpXi0xICogW0wrMC43MDcqQy1BKkxzLUEqUnNdOwogICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNysyKkEpXi0xICogW1IrMC43MDcqQytBKkxzK0EqUnNdOyAqLwogICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMV1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKICAgICAgICAgIHNsZXZSUiA9IHNsZXZSTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKICAgICAgICAgIHNsZXZMTCA9IHNsZXZMUiA9IC1zbGV2Ukw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNytBKV4tMSAqIFtMKzAuNzA3KkMrQSpMc107CiAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3K0EpXi0xICogW1IrMC43MDcqQytBKlJzXTsgKi8KICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzBdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CiAgICAgICAgICBzbGV2UlIgPSBzbGV2TEwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7CiAgICAgICAgICBzbGV2TFIgPSBzbGV2UkwgPSAoRklYUF9TR0wpMDsKICAgICAgICB9CiAgICAgICAgLyogY29tbW9uIGZhY3RvciAqLwogICAgICAgIGNsZXYgID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtcGVnTWl4RG93bklkeDJDb2VmWzBdIC8qIDAuNzA3ICovKSk7CgogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIGZsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIHNsZXZMTCwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIHNsZXZMUiwgMCApOwoKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBmbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBzbGV2UkwsIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICBzbGV2UlIsIDAgKTsKICAgICAgfQojZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZml0IHRvIGFueSBrbm93biBkb3dubWl4IGVxdWF0aW9uISAqLwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIH0KICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLwogICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gID0gMTsKICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gMTsKICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCiAgICBpbkNoTW9kZSA9IENIX01PREVfMl8wXzBfMDsKICB9CgogIGlmIChudW1PdXRDaGFubmVsID09IE9ORV9DSEFOTkVMKSB7CiAgICBGSVhQX0RNWCBtb25vTWl4TGV2ZWw7CiAgICBJTlQgICAgICBtb25vTWl4U2NhbGU7CgojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogICAgaWYgKCAgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkKICAgICAgJiYgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpICkKICAgIHsgLyogQycgPSAoMysyKkEpXi0xICogW0MrTCtSK0EqTHMrQStSc107ICovCiAgICAgIG1vbm9NaXhMZXZlbCA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMl1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKICAgICAgbW9ub01peFNjYWxlID0gMDsKCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCApOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBtb25vTWl4TGV2ZWw7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfRlJPTlRfQ0hBTk5FTF0gICA9IG1vbm9NaXhMZXZlbDsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfRlJPTlRfQ0hBTk5FTF0gID0gbW9ub01peExldmVsOwogICAgICBtb25vTWl4TGV2ZWwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KG1vbm9NaXhMZXZlbCwgbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdKSk7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfUkVBUl9DSEFOTkVMXSAgICA9IG1vbm9NaXhMZXZlbDsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfUkVBUl9DSEFOTkVMXSAgID0gbW9ub01peExldmVsOwogICAgfQogICAgZWxzZQojZW5kaWYKICAgIHsgLyogQycgPSBMICsgUjsgW2RlZmF1bHRdICovCiAgICAgIG1vbm9NaXhMZXZlbCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOwogICAgICBtb25vTWl4U2NhbGUgPSAxOwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKTsgIC8qIEMgaXMgbm90IGluIHRoZSBtaXggKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKICAgIH0KCiAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbCAqLwogICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IDE7CiAgfQoKI2RlZmluZSBNQVhfU0VBUkNIX1NUQVJUX1ZBTCAgKCAtNyApCgogIHsKICAgIExPTkcgY2hTdW1bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgSU5UICBjaFN1bU1heCA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwoKICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIHNjYWxlIGZhY3RvciAqLwogICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPiBtYXhTY2FsZSkKICAgICAgICAgIHsgLyogU3RvcmUgdGhlIG5ldyBtYXhpbXVtICovCiAgICAgICAgICAgIG1heFNjYWxlID0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBJbmRpdmlkdWFseSBhbmFseXNlIG91dHB1dCBjaGFuYWwgbGV2ZWxzICovCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGNoU3VtW291dENoXSA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwogICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CiAgICAgICAgaW50ICBvdnJmbHdQcm90U2NhbGUgPSAwOwoKICAgICAgICAvKiBBY2N1bXVsYXRlIGFsbCBmYWN0b3JzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsICovCiAgICAgICAgY2hTdW1bb3V0Q2hdID0gMDsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgICBTSE9SVCBhZGRGYWN0ID0gRlhfRE1YMlNIUlQobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOwogICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewogICAgICAgICAgICBhZGRGYWN0ID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGRGYWN0IDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgICBjaFN1bVtvdXRDaF0gKz0gYWRkRmFjdDsKICAgICAgICB9CiAgICAgICAgaWYgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKICAgICAgICAgIHdoaWxlIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7CiAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSArPSAxOwogICAgICAgICAgICBjaFN1bVtvdXRDaF0gPj49IDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaFN1bVtvdXRDaF0gPiAwKSB7CiAgICAgICAgICB3aGlsZSAoKGNoU3VtW291dENoXTw8MSkgPD0gKExPTkcpTUFYVkFMX1NHTCkgewogICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgLT0gMTsKICAgICAgICAgICAgY2hTdW1bb3V0Q2hdIDw8PSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBTdG9yZSB0aGUgZGlmZmVyZW50aWFsIHNjYWxpbmcgaW4gdGhlIHNhbWUgYXJyYXkgKi8KICAgICAgICBjaFN1bVtvdXRDaF0gPSBvdnJmbHdQcm90U2NhbGU7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGlmICggKHZhbGlkW291dENoXSAhPSAwKQogICAgICAgICYmIChjaFN1bVtvdXRDaF0gPiBjaFN1bU1heCkgKQogICAgICB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLwogICAgICAgIGNoU3VtTWF4ID0gY2hTdW1bb3V0Q2hdOwogICAgICB9CiAgICB9CiAgICBtYXhTY2FsZSA9IEZES21heChtYXhTY2FsZStjaFN1bU1heCwgMCk7CgogICAgLyogTm9ybWFsaXplIGFsbCBmYWN0b3JzICovCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgICBpZiAobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gIT0gKEZJWFBfRE1YKTApIHsKICAgICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewogICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID0gbWF4U2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKCiAgLyogcmV0dXJuIHRoZSBzY2FsZSBmYWN0b3IgKi8KICAqcE91dFNjYWxlID0gbWF4U2NhbGU7CgogIHJldHVybiAoZXJyKTsKfQoKCi8qKiBPcGVuIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUKICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfT3BlbiAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCiAgKQp7CiAgSEFORExFX1BDTV9ET1dOTUlYIHNlbGY7CiAgCiAgaWYgKHBTZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CgogICpwU2VsZiA9IE5VTEw7CgogIHNlbGYgPSAoSEFORExFX1BDTV9ET1dOTUlYKSBHZXRQY21EbXhJbnN0YW5jZSggMCApOwogIGlmIChzZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX09VVF9PRl9NRU1PUlkpOwogIH0KCiAgLyogUmVzZXQgdGhlIGZ1bGwgaW5zdGFuY2UgKi8KICBwY21EbXhfUmVzZXQoIHNlbGYsIFBDTURNWF9SRVNFVF9GVUxMICk7CgogICpwU2VsZiA9IHNlbGY7CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCi8qKiBSZXNldCBhbGwgc3RhdGljIHZhbHVlcyBsaWtlIGUuZy4gbWl4ZG93biBjb2VmZmljaWVudHMuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIEZsYWdzIHRlbGxpbmcgd2hpY2ggcGFydHMgb2YgdGhlIG1vZHVsZSBzaGFsbCBiZSByZXNldC4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfUmVzZXQgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncwogICkKewogIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9CgogIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9QQVJBTVMpIHsKICAgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKCiAgICBwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUgICA9IFNURVJFT19NT0RFOwogICAgcFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgICAgPSBORVZFUl9ET19QU19ETVg7CiAgICBwUGFyYW1zLT5udW1PdXRDaGFubmVsc01heCA9IFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTOwogICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW4gPSBQQ01fRE1YX0RGTFRfTUlOX09VVF9DSEFOTkVMUzsKICAgIHBQYXJhbXMtPmZyYW1lRGVsYXkgICAgICAgID0gMDsKICAgIHBQYXJhbXMtPmV4cGlyeUZyYW1lICAgICAgID0gUENNX0RNWF9ERkxUX0VYUElSWV9GUkFNRTsKCiAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgICAgICA9IDA7CiAgfQoKICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfQlNfREFUQSkgewogICAgaW50IHNsb3Q7CiAgICAvKiBJbml0IGFsbCBzbG90cyB3aXRoIGEgZGVmYXVsdCBzZXQgKi8KICAgIGZvciAoc2xvdCA9IDA7IHNsb3QgPD0gUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTOyBzbG90ICs9IDEpIHsKICAgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmZGZsdE1ldGFEYXRhLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwogICAgfQogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgoKLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHZhbHVlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9TZXRQYXJhbSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAogICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZQogICkKewogIHN3aXRjaCAocGFyYW0pCiAgewogIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgc2VsZi0+dXNlclBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOwogICAgYnJlYWs7CgogIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6CiAgICBpZiAoICh2YWx1ZSA+IFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUykKICAgICAgfHwgKHZhbHVlIDwgMCkgKSB7CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICB9CiAgICBzZWxmLT51c2VyUGFyYW1zLmZyYW1lRGVsYXkgPSAoVUNIQVIpdmFsdWU7CiAgICBicmVhazsKCiAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKICAgIGNhc2UgU0lYX0NIQU5ORUw6CiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQogICAgY2FzZSBFSUdIVF9DSEFOTkVMOgojZW5kaWYKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7CiAgICBpZiAoICh2YWx1ZSA+IDApCiAgICAgICYmIChzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID4gMCkKICAgICAgJiYgKHZhbHVlID4gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCkgKQogICAgeyAvKiBNSU4gPiBNQVggd291bGQgYmUgYW4gaW52YWxpZCBzdGF0ZS4gVGh1cyBzZXQgTUFYID0gTUlOIGluIHRoaXMgY2FzZS4gKi8KICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW47CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKICAgIGNhc2UgU0lYX0NIQU5ORUw6CiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQogICAgY2FzZSBFSUdIVF9DSEFOTkVMOgojZW5kaWYKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7CiAgICBpZiAoICh2YWx1ZSA+IDApCiAgICAgICYmICh2YWx1ZSA8IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4pICkKICAgIHsgLyogTUFYIDwgTUlOIHdvdWxkIGJlIGFuIGludmFsaWQgc3RhdGUuIFRodXMgc2V0IE1JTiA9IE1BWCBpbiB0aGlzIGNhc2UuICovCiAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4OwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgogICAgc3dpdGNoICgoRFVBTF9DSEFOTkVMX01PREUpdmFsdWUpIHsKICAgIGNhc2UgU1RFUkVPX01PREU6CiAgICBjYXNlIENIMV9NT0RFOgogICAgY2FzZSBDSDJfTU9ERToKICAgIGNhc2UgTUlYRURfTU9ERToKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIHNlbGYtPnVzZXJQYXJhbXMuZHVhbENoYW5uZWxNb2RlID0gKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlOwogICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nID0gMTsgIC8qIEZvcmNlIHByb2Nlc3NpbmcgKi8KICAgIGJyZWFrOwoKICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKICAgIHN3aXRjaCAoKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlKSB7CiAgICBjYXNlIE5FVkVSX0RPX1BTX0RNWDoKICAgIGNhc2UgQVVUT19QU19ETVg6CiAgICBjYXNlIEZPUkNFX1BTX0RNWDoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIHNlbGYtPnVzZXJQYXJhbXMucHNldWRvU3Vyck1vZGUgPSAoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWU7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOwogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgovKiogR2V0IG9uZSBwYXJhbWV0ZXIgdmFsdWUgb2Ygb25lIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHJlY2VpdmluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9HZXRQYXJhbSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAogICAgSU5UICogY29uc3QgICAgICAgICBwVmFsdWUKICApCnsKICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwVXNyUGFyYW1zOwoKICBpZiAoIChzZWxmID09IE5VTEwpCiAgICB8fCAocFZhbHVlID09IE5VTEwpICkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KICBwVXNyUGFyYW1zID0gJnNlbGYtPnVzZXJQYXJhbXM7CgogIHN3aXRjaCAocGFyYW0pCiAgewogIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZXhwaXJ5RnJhbWU7CiAgICBicmVhazsKICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZnJhbWVEZWxheTsKICAgIGJyZWFrOwogIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbjsKICAgIGJyZWFrOwogIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01heDsKICAgIGJyZWFrOwogIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlOwogICAgYnJlYWs7CiAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCiNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCgojZGVmaW5lIE1BWF9EU0VfQU5DX0JZVEVTICAgICAgICggMTYgKSAgICAvKiAxNSBieXRlcyAqLwojZGVmaW5lIEFOQ19EQVRBX1NZTkNfQllURSAgICAgICggMHhCQyApICAvKiBhbmNpbGxhcnkgZGF0YSBzeW5jIGJ5dGUuICovCgovKgogKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCiAqLwpQQ01ETVhfRVJST1IgcGNtRG14X1BhcnNlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCiAgICBVSU5UICBhbmNEYXRhQml0cywKICAgIGludCAgICBpc01wZWcyCiAgKQp7CiAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwogIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CgogIGludCAgIHNraXA0RG14ID0gMCwgc2tpcDRFeHQgPSAwOwogIGludCAgIGRteEx2bEF2YWlsID0gMCwgZXh0RGF0YUF2YWlsID0gMDsKICBpbnQgICBmb3VuZE5ld0RhdGEgPSAwOwogIFVJTlQgIG1pbkFuY0JpdHMgPSAoKGlzTXBlZzIpID8gNSA6IDMpKjg7CgogIGlmICggKHNlbGYgPT0gTlVMTCkKICAgIHx8IChoQnMgID09IE5VTEwpICkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KCiAgYW5jRGF0YUJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKCiAgLyogc2FuaXR5IGNoZWNrcyAqLwogIGlmICggKGFuY0RhdGFCaXRzIDwgbWluQW5jQml0cykKICAgIHx8IChhbmNEYXRhQml0cyA+IEZES2dldFZhbGlkQml0cyhoQnMpKSApIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKCiAgaWYgKGlzTXBlZzIpIHsKICAgIC8qIHNraXAgRFZEIGFuY2lsbGFyeSBkYXRhICovCiAgICBGREtwdXNoRm9yKGhCcywgMTYpOwogIH0KCiAgLyogY2hlY2sgc3luYyB3b3JkICovCiAgaWYgKEZES3JlYWRCaXRzKGhCcyw4KSAhPSBBTkNfREFUQV9TWU5DX0JZVEUpIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgLyogc2tpcCBNUEVHIGF1ZGlvIHR5cGUgYW5kIERvbGJ5IHN1cnJvdW5kIG1vZGUgKi8KICBGREtwdXNoRm9yKGhCcywgNCk7CgogIGlmIChpc01wZWcyKSB7CiAgICAvKiBpbnQgbnVtQW5jQnl0ZXMgPSAqLyBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgLyogYWR2YW5jZWQgZHluYW1pYyByYW5nZSBjb250cm9sICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSAyNDsKICAgIC8qIGRpYWxvZyBub3JtYWxpemF0aW9uICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwogICAgLyogcmVwcm9kdWN0aW9uX2xldmVsICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwogIH0gZWxzZSB7CiAgICBGREtwdXNoRm9yKGhCcywgMik7ICAgLyogZHJjIHByZXNlbnRhdGlvbiBtb2RlICovCiAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBGREtyZWFkQml0KGhCcyk7CiAgICBGREtwdXNoRm9yKGhCcywgNCk7ICAgLyogcmVzZXJ2ZWQgYml0cyAqLwogIH0KCiAgLyogZG93bm1peGluZyBsZXZlbHMgTVBFR3ggc3RhdHVzICovCiAgZG14THZsQXZhaWwgID0gRkRLcmVhZEJpdChoQnMpOwoKICBpZiAoaXNNcGVnMikgewogICAgLyogc2NhbGUgZmFjdG9yIENSQyBzdGF0dXMgKi8KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwogIH0gZWxzZSB7CiAgICAvKiBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gc3RhdHVzICovCiAgICBleHREYXRhQXZhaWwgPSBGREtyZWFkQml0KGhCcyk7CiAgfQoKICAvKiBhdWRpbyBjb2RpbmcgYW5kIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwogIC8qIGNvYXJzZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKICAvKiBmaW5lIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLwogIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwoKICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBETVggbGV2ZWxzICovCiAgRkRLcHVzaEZvcihoQnMsIHNraXA0RG14KTsKCiAgLyogZG93bm1peF9sZXZlbHNfTVBFR1ggKi8KICBpZiAoZG14THZsQXZhaWwpCiAgewogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogY2VudGVyX21peF9sZXZlbF9vbiAqLwogICAgICBwQnNNZXRhRGF0YS0+Y0xldklkeCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9IGVsc2UgewogICAgICBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgfQogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogc3Vycm91bmRfbWl4X2xldmVsX29uICovCiAgICAgIHBCc01ldGFEYXRhLT5zTGV2SWR4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICB9CiAgfQoKICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gKi8KICBGREtwdXNoRm9yKGhCcywgc2tpcDRFeHQpOwoKICAvKiBhbmMgZGF0YSBleHRlbnNpb24gKE1QRUctNCBvbmx5KSAqLwogIGlmIChleHREYXRhQXZhaWwpIHsKICAgIGludCBleHREbXhMdmxTdCwgZXh0RG14R2FpblN0LCBleHREbXhMZmVTdDsKCiAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KICAgIGV4dERteEx2bFN0ICA9IEZES3JlYWRCaXQoaEJzKTsKICAgIGV4dERteEdhaW5TdCA9IEZES3JlYWRCaXQoaEJzKTsKICAgIGV4dERteExmZVN0ICA9IEZES3JlYWRCaXQoaEJzKTsKICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAgIC8qIHJlc2VydmVkIGJpdHMgKi8KCiAgICBpZiAoZXh0RG14THZsU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhBID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhCID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsgIC8qIHJlc2VydmVkIGJpdHMgKi8KICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0KICAgIGlmIChleHREbXhHYWluU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRteEdhaW5JZHg1ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwogICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDIgPSBGREtyZWFkQml0cyhoQnMsIDcpOwogICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9CiAgICBpZiAoZXh0RG14TGZlU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhMZmUgPSBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgLyogcmVzZXJ2ZWQgYml0cyAqLwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfQogIH0KCiAgLyogZmluYWwgc2FuaXR5IGNoZWNrIG9uIHRoZSBhbW91bnQgb2YgcmVhZCBkYXRhICovCiAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7CiAgICBlcnJvclN0YXR1cyA9IFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBOwogIH0KCiAgaWYgKCAoZXJyb3JTdGF0dXMgID09IFBDTURNWF9PSykKICAgICYmIChmb3VuZE5ld0RhdGEgPT0gMSkgKSB7CiAgICAvKiBhbm5vdW5jZSBuZXcgZGF0YSAqLwogICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX0RTRV9EQVRBOwogICAgLyogcmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7CiAgfQoKICByZXR1cm4gKGVycm9yU3RhdHVzKTsKfQoKLyoKICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgogKi8KUENNRE1YX0VSUk9SIHBjbURteF9SZWFkRHZiQW5jRGF0YSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBVQ0hBUiAqcEFuY0RhdGFCdWYsCiAgICBVSU5UICAgYW5jRGF0YUJ5dGVzLAogICAgaW50ICAgIGlzTXBlZzIKICApCnsKICBGREtfQklUU1RSRUFNIGJzOwogIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZiczsKICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CgogIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9CgogIC8qIHNhbml0eSBjaGVja3MgKi8KICBpZiAoIChwQW5jRGF0YUJ1ZiA9PSBOVUxMKQogICAgfHwgKGFuY0RhdGFCeXRlcyA9PSAwKSApIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgRkRLaW5pdEJpdFN0cmVhbSAoaEJzLCBwQW5jRGF0YUJ1ZiwgTUFYX0RTRV9BTkNfQllURVMsIGFuY0RhdGFCeXRlcyo4LCBCU19SRUFERVIpOwoKICBlcnJvclN0YXR1cyA9IHBjbURteF9QYXJzZSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKICAgICAgICAgICAgICAgICAgICAgICAgYW5jRGF0YUJ5dGVzKjgsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXBlZzIgKTsKCiAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cn0KI2VuZGlmICAvKiBEU0VfTUVUQURBVEFfRU5BQkxFICovCgojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQovKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCiAqICBOb3RlOiBDYWxsIG9ubHkgaWYgbWF0cml4X21peGRvd25faWR4X3ByZXNlbnQgaXMgdHJ1ZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KICogQHBhcmFtIFtpbl0gVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCiAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25JZHgsCiAgICBpbnQgICAgICAgICAgICAgICAgIHBzZXVkb1N1cnJvdW5kRW5hYmxlCiAgKQp7CiAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKCiAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgaWYgKG1hdHJpeE1peGRvd25QcmVzZW50KSB7CiAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBwc2V1ZG9TdXJyb3VuZEVuYWJsZTsKICAgIHBCc01ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4ID0gbWF0cml4TWl4ZG93bklkeCAmIDB4MDM7CiAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IFRZUEVfUENFX0RBVEE7CiAgICAvKiBSZXNldCBleHBpcnkgY291bnRlciAqLwogICAgcEJzTWV0YURhdGEtPmV4cGlyeUNvdW50ID0gMDsKICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQojZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KCgovKiogQXBwbHkgZG93biBvciB1cCBtaXhpbmcuCiAqIEBwYXJhbSBbaW5dICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZCB0aGUgdGltZSBkb21haW4gc2lnbmFsLgogKiBAcGFyYW0gW2luXSAgICBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMgaXMgcmV0dXJuZWQgaW50by4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyByZXR1cm5lZCBpbnRvLgogKiBAcGFyYW0gW2luXSAgICBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBvdXRwdXQgdGltZSBkYXRhIGFyZSB3cml0dGVybiBpbnRlcmxlYXZlZCBvciBhcyBzdWJzZXF1ZW50IGJsb2Nrcy4KICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW2lub3V0XSBBcnJheSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCiAqIEBwYXJhbSBbb3V0XSAgIFBvaW50ZXIgb24gYSBmaWVsZCByZWNlaXZpbmcgdGhlIHNjYWxlIGZhY3RvciB0aGF0IGhhcyB0byBiZSBhcHBsaWVkIG9uIGFsbCBzYW1wbGVzIGFmdGVyd2FyZHMuCiAqICAgICAgICAgICAgICAgIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHNjYWxpbmcgaXMgZG9uZSBpbnRlcm5hbGx5LgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9BcHBseUZyYW1lICgKICAgICAgICBIQU5ETEVfUENNX0RPV05NSVggICAgICBzZWxmLAogICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgKnBQY21CdWYsCiAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscywKICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmSW50ZXJsZWF2ZWQsCiAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICAgICAgY2hhbm5lbFR5cGVbXSwKICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLAogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAqcERteE91dFNjYWxlCiAgKQp7CiAgUENNX0RNWF9VU0VSX1BBUkFNUyAgKnBQYXJhbSA9IE5VTEw7CiAgUENNRE1YX0VSUk9SICBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKICBEVUFMX0NIQU5ORUxfTU9ERSAgZHVhbENoYW5uZWxNb2RlOwogIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBpbkNoTW9kZTsKICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgb3V0Q2hNb2RlOwogIElOVCAgIGRldk51bGw7ICAvKiBKdXN0IGEgZHVtbXkgdG8gYXZvaWQgYSBsb3Qgb2YgYnJhbmNoZXMgaW4gdGhlIGNvZGUgKi8KICBpbnQgICBudW1PdXRDaGFubmVscywgbnVtSW5DaGFubmVsczsKICBpbnQgICBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CiAgaW50ICAgZG14TWF4U2NhbGUsIGRteFNjYWxlOwogIGludCAgIGNoLCBzbG90OwogIFVDSEFSIGluT2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwoKICBETVhfQlNfTUVUQV9EQVRBICBic01ldGFEYXRhOwoKICBpZiAoIChzZWxmICAgICAgICAgICA9PSBOVUxMKQogICAgfHwgKG5DaGFubmVscyAgICAgID09IE5VTEwpCiAgICB8fCAoY2hhbm5lbFR5cGUgICAgPT0gTlVMTCkKICAgIHx8IChjaGFubmVsSW5kaWNlcyA9PSBOVUxMKQogICAgfHwgKGNoYW5uZWxNYXBwaW5nID09IE5VTEwpICkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgLyogSW5pdCB0aGUgb3V0cHV0IHNjYWxpbmcgKi8KICBkbXhTY2FsZSA9IDA7CiAgaWYgKHBEbXhPdXRTY2FsZSAhPSBOVUxMKSB7CiAgICAvKiBBdm9pZCBmaW5hbCBzY2FsaW5nIGludGVybmFsbHkgYW5kIGhhbmQgaXQgdG8gdGhlIG91dHNpZGUgd29ybGQuICovCiAgICAqcERteE91dFNjYWxlID0gMDsKICAgIGRteE1heFNjYWxlID0gUENNRE1YX01BWF9IRUFEUk9PTTsKICB9IGVsc2UgewogICAgLyogQXBwbHkgdGhlIHNjYWxpbmcgaW50ZXJuYWxseS4gKi8KICAgIHBEbXhPdXRTY2FsZSA9ICZkZXZOdWxsOyAgLyogcmVkaXJlY3QgdG8gdGVtcG9yYWwgc3RhY2sgbWVtb3J5ICovCiAgICBkbXhNYXhTY2FsZSA9IDA7CiAgfQoKICBwUGFyYW0gPSAmc2VsZi0+dXNlclBhcmFtczsKICBudW1JbkNoYW5uZWxzID0gKm5DaGFubmVsczsKCiAgLyogUGVyZm9ybSBzb21lIGlucHV0IHNhbml0eSBjaGVja3MgKi8KICBpZiAocFBjbUJ1ZiA9PSBOVUxMKSAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQogIGlmIChmcmFtZVNpemUgPT0gMCkgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9CiAgaWYgKCAobnVtSW5DaGFubmVscyA9PSAwKQogICAgfHwgKG51bUluQ2hhbm5lbHMgPiBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUykgKQogICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9CgogIC8qIENoZWNrIG9uIG1pc2NvbmZpZ3VyYXRpb24gKi8KICBGREtfQVNTRVJUKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKSBcCiAgICAgICAgICAgfHwgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikpOwoKICAvKiBEZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBoYXMgdG8gZG8gcHJvY2Vzc2luZyAqLwogIGlmICggICAoc2VsZi0+YXBwbHlQcm9jZXNzaW5nID09IDApCiAgICAmJiAgKChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApCiAgICAgIHx8IChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IG51bUluQ2hhbm5lbHMpKQogICAgJiYgICAocFBhcmFtLT5udW1PdXRDaGFubmVsc01pbiA8PSBudW1JbkNoYW5uZWxzKSApIHsKICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgIHJldHVybiAoZXJyb3JTdGF0dXMpOwogIH0KCiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgaWYgKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+IDApCiAgICAmJiAobnVtSW5DaGFubmVscyA+IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXgpICkgewogICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4OwogIH0KICBlbHNlIGlmIChudW1JbkNoYW5uZWxzIDwgcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikgewogICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluOwogIH0KICBlbHNlIHsKICAgIG51bU91dENoYW5uZWxzID0gbnVtSW5DaGFubmVsczsKICB9CgogIGR1YWxDaGFubmVsTW9kZSA9IHBQYXJhbS0+ZHVhbENoYW5uZWxNb2RlOwoKICAvKiBBbmFseXNlIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZ2V0IGNoYW5uZWwgb2Zmc2V0CiAgICogdGFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgZml4ZWQgY2hhbm5lbCBsYWJlbHMuICovCiAgZXJyb3JTdGF0dXMgPSBnZXRDaGFubmVsTW9kZSgKICAgICAgICAgICAgICAgICAgIG51bUluQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgaW5PZmZzZXRUYWJsZSwKICAgICAgICAgICAgICAgICAgJmluQ2hNb2RlCiAgICAgICAgICAgICAgICAgKTsKICBpZiAoIFBDTURNWF9JU19GQVRBTF9FUlJPUihlcnJvclN0YXR1cykKICAgIHx8IChpbkNoTW9kZSA9PSBDSF9NT0RFX1VOREVGSU5FRCkgKSB7CiAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgYmVjYXVzZSB0aGUgY2hhbm5lbAogICAgICAgY29uZmlndXJhdGlvbiBoYXMgbm90IGJlZW4gY2hhbmdlZC4gSnVzdCBleGl0LiAqLwogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcpOwogIH0KCiAgLyogU2V0IGlucHV0IHN0cmlkZSBhbmQgb2Zmc2V0ICovCiAgaWYgKGZJbnRlcmxlYXZlZCkgewogICAgaW5TdHJpZGUgID0gbnVtSW5DaGFubmVsczsKICAgIG9mZnNldCA9IDE7ICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogIH0gZWxzZSB7CiAgICBpblN0cmlkZSAgPSAxOwogICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAgICAgICAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCiAgfQoKICAvKiBSZXNldCBkb3dubWl4IG1ldGEgZGF0YSBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIChwUGFyYW0tPmV4cGlyeUZyYW1lID4gMCkKICAgICYmICgrK3NlbGYtPmJzTWV0YURhdGFbMF0uZXhwaXJ5Q291bnQgPiBwUGFyYW0tPmV4cGlyeUZyYW1lKSApCiAgeyAvKiBUaGUgbWV0YWRhdGEgcmVhZCBmcm9tIGJpdHN0cmVhbSBpcyB0b28gb2xkLiAqLwogICAgUENNRE1YX0VSUk9SIGVyciA9IHBjbURteF9SZXNldChzZWxmLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CiAgICBGREtfQVNTRVJUKGVyciA9PSBQQ01ETVhfT0spOwogIH0KICBGREttZW1jcHkoJmJzTWV0YURhdGEsICZzZWxmLT5ic01ldGFEYXRhW3BQYXJhbS0+ZnJhbWVEZWxheV0sIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CiAgLyogTWFpbnRhaW4gZGVsYXkgbGluZSAqLwogIGZvciAoc2xvdCA9IHBQYXJhbS0+ZnJhbWVEZWxheTsgc2xvdCA+IDA7IHNsb3QgLT0gMSkgewogICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmc2VsZi0+YnNNZXRhRGF0YVtzbG90LTFdLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwogIH0KCiAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKICBpZiAoIG51bUluQ2hhbm5lbHMgPiBudW1PdXRDaGFubmVscyApCiAgeyAvKiBBcHBseSBkb3dubWl4ICovCiAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0lOX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwogICAgSU5UX1BDTSAgKnBPdXRQY21bUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwogICAgRklYUF9ETVggIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgIFVDSEFSICAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICBVSU5UICAgICAgc2FtcGxlOwogICAgaW50ICAgICAgIGNoQ2ZnID0gMDsKICAgIGludCAgICAgICBieXBTY2FsZSA9IDA7CgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID49IDcpCiAgICBpZiAobnVtSW5DaGFubmVscyA+IFNJWF9DSEFOTkVMKSB7CiAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBtdWx0aVB1cnBvc2VDaFR5cGVbMl07CgogICAgICAvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIG11bHRpcHVycG9zZSBjaGFubmVscyAqLwogICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMF0gPSBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdXTsKICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzFdID0gY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOwoKICAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gaXMgb25lIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLiAqLwogICAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CiAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgLyogY2hDZmcgNyB8fCAxNCAqLwogICAgICAgIC8qIEZ1cnRoZXIgYW5hbHlzZSB0aGUgaW5wdXQgY29uZmlnIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gQ0hfTU9ERV81XzBfMl8xIGNvbmZpZ3MuICovCiAgICAgICAgaWYgKCAobXVsdGlQdXJwb3NlQ2hUeXBlWzBdID09IEFDVF9GUk9OVF9UT1ApCiAgICAgICAgICAmJiAobXVsdGlQdXJwb3NlQ2hUeXBlWzFdID09IEFDVF9GUk9OVF9UT1ApICkgewogICAgICAgICAgY2hDZmcgPSAxNDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hDZmcgPSA3OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAvKiBjaENmZyAxMSAqLwogICAgICAgIGNoQ2ZnID0gMTE7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgLyogY2hDZmcgMTIgKi8KICAgICAgICBjaENmZyA9IDEyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoQ2ZnID0gMDsgIC8qIE5vdCBhIGtub3duIGNvbmZpZyAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiNlbmRpZgoKICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCiAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKCiAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY29uZmlndXJhdGlvbi4gKi8KICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKICAgICAgICAgICAgb3V0Q2hNb2RlLAogICAgICAgICAgICBjaGFubmVsTWFwcGluZywKICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQogICAgICAgICAgICk7CiAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uISAqLwoKICAgIC8qIENyZWF0ZSB0aGUgRE1YIG1hdHJpeCAqLwogICAgZXJyb3JTdGF0dXMgPSBnZXRNaXhGYWN0b3JzICgKICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAoUENNX0RNWF9DSEFOTkVMX01PREUpY2hDZmcgOiBpbkNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICBvdXRDaE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgJmJzTWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgbWl4RmFjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZQogICAgICAgICAgICAgICAgICAgICApOwogICAgLyogTm8gZmF0YWwgZXJyb3JzIGNhbiBvY2N1ciBoZXJlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJldHVybiBhIHZhbGlkIG1hdHJpeC4KICAgICAgIFRoZSBlcnJvciBjb2RlIGlzIHVzZWQgdG8gc2lnbmFsIGNvbmZpZ3VyYXRpb25zIGFuZCBtYXRyaWNlcyB0aGF0IGFyZSBub3QgY29uZm9ybSB0byBhbnkgc3RhbmRhcmQuICovCgogICAgLyogRGV0ZXJtaW5lIHRoZSBmaW5hbCBzY2FsaW5nICovCiAgICBieXBTY2FsZSA9IEZES21pbihkbXhNYXhTY2FsZSwgZG14U2NhbGUpOwogICAgKnBEbXhPdXRTY2FsZSArPSBieXBTY2FsZTsKICAgIGRteFNjYWxlIC09IGJ5cFNjYWxlOwoKICAgIHsgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3IgaW5wdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLwogICAgICBpbnQgaW5DaCwgb3V0Q2gsIG1hcFtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgIGNoID0gMDsKICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2luQ2hdICE9IDI1NSkgewogICAgICAgICAgcEluUGNtW2NoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbaW5DaF0qb2Zmc2V0XTsKICAgICAgICAgIG1hcFtjaCsrXSAgPSBpbkNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2ggIT0gbnVtSW5DaGFubmVscykgewogICAgICAgICAgQUxPR0UoImIvMjM4NzY0NDQiKTsKICAgICAgICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKICAgICAgfQoKICAgICAgLyogUmVtb3ZlIHVudXNlZCBjb2xzIGZyb20gZmFjdG9yIG1hdHJpeCAqLwogICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKICAgICAgICBpZiAoaW5DaCAhPSBtYXBbaW5DaF0pIHsKICAgICAgICAgIGludCBvdXRDaDsKICAgICAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBtaXhGYWN0b3JzW291dENoXVttYXBbaW5DaF1dOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3Igb3V0cHV0LiBSZW1vdmUgZW1wdHkgY29scy4gKi8KICAgICAgY2ggPSAwOwogICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSAhPSAyNTUpIHsKICAgICAgICAgIHBPdXRQY21bY2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdKm9mZnNldF07CiAgICAgICAgICBtYXBbY2grK10gID0gb3V0Q2g7CiAgICAgICAgfQogICAgICB9CiAgICAgIEZES19BU1NFUlQoY2ggPT0gbnVtT3V0Q2hhbm5lbHMpOwoKICAgICAgLyogUmVtb3ZlIHVudXNlZCByb3dzIGZyb20gZmFjdG9yIG1hdHJpeCAqLwogICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoKz0xKSB7CiAgICAgICAgaWYgKG91dENoICE9IG1hcFtvdXRDaF0pIHsKICAgICAgICAgIEZES21lbWNweSgmbWl4RmFjdG9yc1tvdXRDaF0sICZtaXhGYWN0b3JzW21hcFtvdXRDaF1dLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoRklYUF9ETVgpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBTYW1wbGUgcHJvY2Vzc2luZyBsb29wICovCiAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspCiAgICB7CiAgICAgIEZJWFBfUENNIHRJbltQQ01fRE1YX01BWF9JTl9DSEFOTkVMU107CiAgICAgIEZJWFBfREJMIHRPdXRbUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTXSA9IHsgKEZJWFBfREJMKTAgfTsKICAgICAgaW50IGluQ2gsIG91dENoOwoKICAgICAgLyogUHJlbG9hZCBhbGwgaW5wdXQgc2FtcGxlcyAqLwogICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKICAgICAgICB0SW5baW5DaF0gPSAoRklYUF9QQ00pKnBJblBjbVtpbkNoXTsKICAgICAgICBwSW5QY21baW5DaF0gKz0gaW5TdHJpZGU7CiAgICAgIH0KICAgICAgLyogQXBwbHkgZG93bm1peCBjb2VmZmljaWVudHMgdG8gaW5wdXQgc2FtcGxlcyBhbmQgYWNjdW11bGF0ZSBmb3Igb3V0cHV0ICovCiAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBudW1PdXRDaGFubmVsczsgb3V0Q2grPTEpIHsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IG51bUluQ2hhbm5lbHM7IGluQ2grPTEpIHsKICAgICAgICAgIHRPdXRbb3V0Q2hdICs9IGZNdWx0KHRJbltpbkNoXSwgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOwogICAgICAgIH0KICAgICAgICAvKiBXcml0ZSBzYW1wbGUgKi8KI2lmIChTQU1QTEVfQklUUyA9PSBERlJBQ1RfQklUUykKICAgICAgICAqcE91dFBjbVtvdXRDaF0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRPdXRbb3V0Q2hdLCBkbXhTY2FsZSwgU0FNUExFX0JJVFMpOwojZWxzZQogICAgICAgICpwT3V0UGNtW291dENoXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRPdXRbb3V0Q2hdLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUy1kbXhTY2FsZSwgU0FNUExFX0JJVFMpOwojZW5kaWYKICAgICAgICBwT3V0UGNtW291dENoXSArPSBvdXRTdHJpZGU7CiAgICAgIH0KICAgIH0KCiAgICAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKCiAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAgZWxzZQojZW5kaWYgLyogUENNX0RPV05NSVhfRU5BQkxFICovCiNpZmRlZiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFCiAgaWYgKCBudW1JbkNoYW5uZWxzIDwgbnVtT3V0Q2hhbm5lbHMgKQogIHsgLyogQXBwbHkgcnVkaW1lbnRhcnkgdXBtaXggKi8KICAgIC8qIFNldCB1cCBjaGFubmVsIHBvaW50ZXIgKi8KICAgIFVJTlQgICAgIHNhbXBsZTsKICAgIFVDSEFSICAgIG91dE9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKCiAgICAvKiBGSVJTVCBTVEFHRQogICAgICAgICBDcmVhdGUgYSBzdGVyZW8vZHVhbCBjaGFubmVsIHNpZ25hbCAqLwogICAgaWYgKG51bUluQ2hhbm5lbHMgPT0gT05FX0NIQU5ORUwpCiAgICB7CiAgICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICBJTlRfUENNICAqcE91dExGLCAqcE91dFJGOwoKICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBUV09fQ0hBTk5FTCA6IDE7CiAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW1RXT19DSEFOTkVMXTsKCiAgICAgIC8qIEdldCBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsIG1hcHBpbmcgZm9yIHRoaXMKICAgICAgICogc3RhZ2VzIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKGFsd2F5cyBTVEVSRU8pLiAqLwogICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCiAgICAgICAgICAgICAgb3V0Q2hNb2RlLAogICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAogICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAogICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCiAgICAgICAgICAgICApOwogICAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uISAqLwoKICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlci4gVGhlIGZpcnN0IGNoYW5uZWwgaXMgYWx3YXlzIGF0IGluZGV4IDAuICovCiAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSAmcFBjbUJ1ZlsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsgIC8qIENvbnNpZGVyaW5nIGlucHV0IG1hcHBpbmcgY291bGQgbGVhZCB0byBhIGludmFsaWQgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBkZWNsYXJlZCB0byBiZSBhIGZyb250IGNoYW5uZWwuICovCgogICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoZm9yIHRoaXMgc3RhZ2UpLiAqLwogICAgICBwT3V0TEYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtMRUZUX0ZST05UX0NIQU5ORUxdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgIHBPdXRSRiA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW1JJR0hUX0ZST05UX0NIQU5ORUxdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CgogICAgICAvKiAxLzAgaW5wdXQ6ICovCiAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewogICAgICAgIC8qIEwnID0gQzsgIFInID0gQzsgKi8KICAgICAgICAqcE91dExGID0gKnBPdXRSRiA9ICpwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdOwoKICAgICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdIC09IGluU3RyaWRlOwogICAgICAgIHBPdXRMRiAtPSBvdXRTdHJpZGU7IHBPdXRSRiAtPSBvdXRTdHJpZGU7CiAgICAgIH0KCiAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgc3RhZ2U6ICovCiAgICAgIGluU3RyaWRlID0gb3V0U3RyaWRlOwogICAgICBpbkNoTW9kZSA9IG91dENoTW9kZTsKICAgICAgRkRLbWVtY3B5KGluT2Zmc2V0VGFibGUsIG91dE9mZnNldFRhYmxlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICAgIH0KCiNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID4gMikKICAgIC8qIFNFQ09ORCBTVEFHRQogICAgICAgICBFeHRlbmQgd2l0aCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmVkIHRoZSBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuICovCiAgICBpZiAobnVtT3V0Q2hhbm5lbHMgPiBUV09fQ0hBTk5FTCkKICAgIHsKICAgICAgSU5UX1BDTSAqcEluW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSAgPSB7IE5VTEwgfTsKICAgICAgSU5UX1BDTSAqcE91dFtQQ01fRE1YX01BWF9DSEFOTkVMU10gPSB7IE5VTEwgfTsKICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICBpbkNoVHlwZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICBVQ0hBUiAgICBpbkNoSW5kaWNlc1tQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgIFVDSEFSICAgIG51bUNoUGVyR3JwWzJdW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsKICAgICAgaW50ICAgICAgbkNvbnRlbnRDaCA9IDA7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgd2l0aCBjb250ZW50ICovCiAgICAgIGludCAgICAgIG5FbXB0eUNoID0gMDsgICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLwogICAgICBpbnQgICAgICBjaCwgY2hHcnAsIGlzQ29tcGF0aWJsZSA9IDE7CgogICAgICAvKiBEbyBub3QgY2hhbmdlIHRoZSBzaWduYWxsaW5nIHdoaWNoIGlzIHRoZSBjaGFubmVsIHR5cGVzIGFuZCBpbmRpY2VzLgogICAgICAgICBKdXN0IHJlb3JkZXIgYW5kIGFkZCBjaGFubmVscy4gU28gZmlyc3Qgc2F2ZSB0aGUgaW5wdXQgc2lnbmFsbGluZy4gKi8KICAgICAgRkRLbWVtY3B5KGluQ2hUeXBlcywgY2hhbm5lbFR5cGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKICAgICAgRkRLbWVtY3B5KGluQ2hJbmRpY2VzLCBjaGFubmVsSW5kaWNlcywgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CgogICAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLwogICAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbbnVtT3V0Q2hhbm5lbHNdOwoKICAgICAgLyogQ2hlY2sgaWYgaW5wdXQgY2hhbm5lbCBjb25maWcgY2FuIGJlIGVhc2lseSBtYXBwZWQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IGNvbmZpZy4gKi8KICAgICAgZm9yIChjaEdycCA9IDA7IGNoR3JwIDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGNoR3JwICs9IDEpIHsKICAgICAgICBudW1DaFBlckdycFtJTl1bY2hHcnBdID0gKGluQ2hNb2RlID4+IChjaEdycCo0KSkgJiAweEY7CiAgICAgICAgbnVtQ2hQZXJHcnBbT1VUXVtjaEdycF0gPSAob3V0Q2hNb2RlID4+IChjaEdycCo0KSkgJiAweEY7CgogICAgICAgIGlmIChudW1DaFBlckdycFtJTl1bY2hHcnBdID4gbnVtQ2hQZXJHcnBbT1VUXVtjaEdycF0pIHsKICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IDA7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICggaXNDb21wYXRpYmxlICkgewogICAgICAgIC8qIEdldCBuZXcgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbAogICAgICAgICAqIG1hcHBpbmcgZm9yIHRoZSBkZXNpcmVkIG91dHB1dCBjaGFubmVsIG1vZGUuICovCiAgICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAogICAgICAgICAgICAgICAgb3V0Q2hNb2RlLAogICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCiAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKICAgICAgICAgICAgICAgKTsKICAgICAgICAvKiBJZiB0aGUgaW5wdXQgY29uZmlnIGhhcyBhIGJhY2sgY2VudGVyIGNoYW5uZWwgYnV0IHRoZSBvdXRwdXQKICAgICAgICAgICBjb25maWcgaGFzIG5vdCwgY29weSBpdCB0byBsZWZ0IGFuZCByaWdodCAoaWYgYXZhaWxhYmxlKS4gKi8KICAgICAgICBpZiAoICAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdJTIpCiAgICAgICAgICAmJiAhKG51bUNoUGVyR3JwW09VVF1bQ0hfR1JPVVBfUkVBUl0lMikgKSB7CiAgICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdID09IDEpIHsKICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtSSUdIVF9SRUFSX0NIQU5ORUxdID0gaW5PZmZzZXRUYWJsZVtMRUZUX1JFQVJfQ0hBTk5FTF07CiAgICAgICAgICB9IGVsc2UgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAzKSB7CiAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdID0gaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogSnVzdCBjb3B5IGFuZCBleHRlbmQgdGhlIG9yaWdpbmFsIGNvbmZpZyAqLwogICAgICAgIEZES21lbWNweShvdXRPZmZzZXRUYWJsZSwgaW5PZmZzZXRUYWJsZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgICAgIH0KCiAgICAgIC8qIFNldCBJL08gY2hhbm5lbCBwb2ludGVyLgogICAgICAgICBOb3RlOiBUaGUgZm9sbG93aW5nIGFzc2lnbm1lbnQgYWxnb3JpdGhtIGNsZWFycyB0aGUgY2hhbm5lbCBvZmZzZXQgdGFibGVzLgogICAgICAgICAgICAgICBUaHVzIHRoZXkgY2FuIG5vdCBiZSB1c2VkIGFmdGVyd2FyZHMuICovCiAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewogICAgICAgIGlmICggKG91dE9mZnNldFRhYmxlW2NoXSA8IDI1NSkKICAgICAgICAgICYmIChpbk9mZnNldFRhYmxlW2NoXSA8IDI1NSkgKQogICAgICAgIHsgLyogU2V0IEkvTyBwb2ludGVyOiAqLwogICAgICAgICAgcEluW25Db250ZW50Q2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOwogICAgICAgICAgcE91dFtuQ29udGVudENoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IGluQ2hJbmRpY2VzW2luT2Zmc2V0VGFibGVbY2hdXTsKICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OwogICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OwogICAgICAgICAgbkNvbnRlbnRDaCArPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIGlzQ29tcGF0aWJsZSApIHsKICAgICAgICAvKiBBc3NpZ24gdGhlIHJlbWFpbmluZyBpbnB1dCBjaGFubmVscy4KICAgICAgICAgICBUaGlzIGlzIGp1c3QgYSBzYWZldHkgYXBwbGlhbmNlLiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBpdC4gKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2NoXSA8IDI1NSkgewogICAgICAgICAgICBpbnQgIG91dENoOwogICAgICAgICAgICBmb3IgKG91dENoID0gMCA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoICs9IDEpIHsKICAgICAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbb3V0Q2hdIDwgMjU1KSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogU2V0IEkvTyBwb2ludGVyOiAqLwogICAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07CiAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtvdXRDaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgICAgICAgLyogVXBkYXRlIHNpZ25hbGxpbmcgKi8KICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdXSA9IGluQ2hUeXBlc1tpbk9mZnNldFRhYmxlW2NoXV07CiAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW291dENoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CiAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbY2hdID0gMjU1OwogICAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPSAyNTU7CiAgICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewogICAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW2NoXSA8IDI1NSkgewogICAgICAgICAgICBwT3V0W25Db250ZW50Q2grbkVtcHR5Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgICAgICAgIC8qIEV4cGFuZCBvdXRwdXQgc2lnbmFsbGluZyAqLwogICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gQUNUX05PTkU7CiAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBuRW1wdHlDaDsKICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbY2hdID0gMjU1OwogICAgICAgICAgICBuRW1wdHlDaCArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCiAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoKz0xKSB7CiAgICAgICAgICBwT3V0W2NoXSA9ICZwUGNtQnVmW2NoKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KICAgICAgICAgIGNoYW5uZWxUeXBlW2NoXSA9IEFDVF9OT05FOwogICAgICAgICAgY2hhbm5lbEluZGljZXNbY2hdID0gbkVtcHR5Q2g7CiAgICAgICAgICBuRW1wdHlDaCArPSAxOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogRmlyc3QgY29weSB0aGUgY2hhbm5lbHMgdGhhdCBoYXZlIHNpZ25hbCAqLwogICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKz0xKSB7CiAgICAgICAgSU5UX1BDTSB0SW5bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICAgIC8qIFJlYWQgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoKz0xKSB7CiAgICAgICAgICB0SW5bY2hdID0gKnBJbltjaF07CiAgICAgICAgICBwSW5bY2hdIC09IGluU3RyaWRlOwogICAgICAgIH0KICAgICAgICAvKiBXcml0ZSBhbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNvbnRlbnRDaDsgY2grPTEpIHsKICAgICAgICAgICpwT3V0W2NoXSA9IHRJbltjaF07CiAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBDbGVhciBhbGwgdGhlIG90aGVyIGNoYW5uZWxzICovCiAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewogICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCs9MSkgewogICAgICAgICAgKnBPdXRbY2hdID0gKElOVF9QQ00pMDsKICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KI2VuZGlmICAvKiBpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID4gMikgKi8KCiAgICAvKiB1cGRhdGUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICAgICpuQ2hhbm5lbHMgPSBudW1PdXRDaGFubmVsczsKICB9IC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KICBlbHNlCiNlbmRpZiAvKiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFICovCiAgaWYgKCBudW1JbkNoYW5uZWxzID09IG51bU91dENoYW5uZWxzICkKICB7CiAgICAvKiBEb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBoZXJlICovCgogICAgc3dpdGNoIChudW1JbkNoYW5uZWxzKQogICAgewogICAgY2FzZSAyOgogICAgICB7IC8qIFNldCB1cCBjaGFubmVsIHBvaW50ZXIgKi8KICAgICAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgICBJTlRfUENNICAqcE91dEwsICpwT3V0UjsKICAgICAgICBGSVhQX0RNWCAgZmxldjsKCiAgICAgICAgVUlOVCBzYW1wbGU7CiAgICAgICAgaW50IGluU3RyaWRlLCBvdXRTdHJpZGUsIG9mZnNldDsKCiAgICAgICAgaWYgKGZJbnRlcmxlYXZlZCkgewogICAgICAgICAgaW5TdHJpZGUgID0gbnVtSW5DaGFubmVsczsKICAgICAgICAgIG91dFN0cmlkZSA9IDI7ICAvKiBmaXhlZCAhISEgKGJlbG93IHN0ZXJlbyBpcyBkb253bWl4ZWQgdG8gbW9ubyBpZiByZXF1aXJlZCAqLwogICAgICAgICAgb2Zmc2V0ID0gMTsgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluU3RyaWRlICA9IDE7CiAgICAgICAgICBvdXRTdHJpZGUgPSAxOwogICAgICAgICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCiAgICAgICAgfQoKICAgICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyICovCiAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtMRUZUX0ZST05UX0NIQU5ORUxdKm9mZnNldF07CiAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXRdOwoKICAgICAgICAvKiBTZXQgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAoc2FtZSBhcyBpbnB1dCkgKi8KICAgICAgICBwT3V0TCAgPSAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF07CiAgICAgICAgcE91dFIgID0gIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXTsKCiAgICAgICAgLyogU2V0IGRvd25taXggbGV2ZWxzOiAqLwogICAgICAgIGZsZXYgPSBGTDJGWENPTlNUX0RNWCgwLjcwNzEwNjc4Zik7CiAgICAgICAgLyogMi8wIGlucHV0OiAqLwogICAgICAgIHN3aXRjaCAoZHVhbENoYW5uZWxNb2RlKQogICAgICAgIHsKICAgICAgICBjYXNlIENIMV9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMTsgIFInID0gMC43MDcgKiBDaDEgKi8KICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewogICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPQogICAgICAgICAgICAgIChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKGZNdWx0KChGSVhQX1BDTSkqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUywgU0FNUExFX0JJVFMpOwoKICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CiAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDSDJfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDI7ICBSJyA9IDAuNzA3ICogQ2gyICovCiAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0KICAgICAgICAgICAgICAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVChmTXVsdCgoRklYUF9QQ00pKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSwgZmxldiksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLCBTQU1QTEVfQklUUyk7CgogICAgICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CiAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSVhFRF9NT0RFOiAgLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsgIFInID0gMC41KkNoMSArIDAuNSpDaDIgKi8KICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewogICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPSAoKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdID4+IDEpICsgKCpwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gPj4gMSk7CgogICAgICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgIGNhc2UgU1RFUkVPX01PREU6CiAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgLyogbm90aGluZyB0byBkbyAqLwogICAgICBicmVhazsKICAgIH0KICB9CgogIHJldHVybiAoZXJyb3JTdGF0dXMpOwp9CgoKLyoqIENsb3NlIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgaGFuZGxlIG9mIHRoZSBpbnN0YW5jZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfQ2xvc2UgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgogICkKewogIGlmIChwU2VsZiA9PSBOVUxMKSB7CiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgfQoKICBGcmVlUGNtRG14SW5zdGFuY2UoIHBTZWxmICk7CiAgKnBTZWxmID0gTlVMTDsKCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgoKLyoqIEdldCBsaWJyYXJ5IGluZm8gZm9yIHRoaXMgbW9kdWxlLgogKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgTElCX0lORk8gc3RydWN0dXJlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqLwpQQ01ETVhfRVJST1IgcGNtRG14X0dldExpYkluZm8oIExJQl9JTkZPICppbmZvICkKewogIGludCBpOwoKICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICByZXR1cm4gUENNRE1YX0lOVkFMSURfQVJHVU1FTlQ7CiAgfQoKICAvKiBTZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CiAgfQogIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgewogICAgcmV0dXJuIFBDTURNWF9VTktOT1dOOwogIH0KCiAgLyogQWRkIHRoZSBsaWJyYXJ5IGluZm8gKi8KICBpbmZvW2ldLm1vZHVsZV9pZCAgPSBGREtfUENNRE1YOwogIGluZm9baV0udmVyc2lvbiAgICA9IExJQl9WRVJTSU9OKFBDTURNWF9MSUJfVkwwLCBQQ01ETVhfTElCX1ZMMSwgUENNRE1YX0xJQl9WTDIpOwogIExJQl9WRVJTSU9OX1NUUklORyhpbmZvK2kpOwogIGluZm9baV0uYnVpbGRfZGF0ZSA9IFBDTURNWF9MSUJfQlVJTERfREFURTsKICBpbmZvW2ldLmJ1aWxkX3RpbWUgPSBQQ01ETVhfTElCX0JVSUxEX1RJTUU7CiAgaW5mb1tpXS50aXRsZSAgICAgID0gUENNRE1YX0xJQl9USVRMRTsKCiAgLyogU2V0IGZsYWdzICovCiAgaW5mb1tpXS5mbGFncyA9IDAKI2lmZGVmIFBDTV9ET1dOTUlYX0VOQUJMRQogICAgICB8IENBUEZfRE1YX0JMSU5EICAgLyogQXQgbGVhc3QgYmxpbmQgZG93bm1peGluZyBpcyBwb3NzaWJsZSAqLwogI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9QQ0UgICAgIC8qIEd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIE1QRUctMi80IFByb2dyYW0gQ29uZmlnIEVsZW1lbnRzIChQQ0UpLiAqLwogICNpZmRlZiBBUklCX01JWERPV05fRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfQVJJQiAgICAvKiBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZXF1YXRpb25zIGFuZCBsZXZlbHMuICovCiAgI2VuZGlmCiAjZW5kaWYgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwogI2lmZGVmIERTRV9NRVRBREFUQV9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9EVkIgICAgIC8qIEd1aWRlZCBkb3dubWl4IHdpdGggZGF0YSBmcm9tIERWQiBhbmNpbGxhcnkgZGF0YSBmaWVsZHMuICovCiAjZW5kaWYKI2VuZGlmIC8qIFBDTV9ET1dOTUlYX0VOQUJMRSAqLwojaWZkZWYgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRQogICAgICB8IENBUEZfRE1YX0NIX0VYUCAgLyogU2ltcGxlIHVwbWl4aW5nIGJ5IGR1YmxpY2F0aW5nIGNoYW5uZWxzIG9yIGFkZGluZyB6ZXJvIGNoYW5uZWxzLiAqLwojZW5kaWYKICAgICAgOwoKICAvKiBBZGQgbGliIGluZm8gZm9yIEZESyB0b29scyAoaWYgbm90IHlldCBkb25lKS4gKi8KICBGREtfdG9vbHNHZXRMaWJJbmZvKGluZm8pOwoKICByZXR1cm4gUENNRE1YX09LOwp9CgoKCg==