Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiBwcm90b3R5cGVzICAKKi8KCiNpZm5kZWYgX19FTlZFTE9QRV9FWFRSQUNUSU9OX0gKI2RlZmluZSBfX0VOVkVMT1BFX0VYVFJBQ1RJT05fSAoKI2luY2x1ZGUgInNicmRlY29kZXIuaCIKCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiNpbmNsdWRlICJscHBfdHJhbi5oIgoKI2luY2x1ZGUgInBzZGVjLmgiCgojZGVmaW5lIEVOVl9FWFBfRlJBQ1QgMAovKiE8IFNoaWZ0IHJhdyBlbnZlbG9wZSBkYXRhIHRvIHN1cHBvcnQgZnJhY3Rpb25hbCBudW1iZXJzLgogIENhbiBiZSBzZXQgdG8gOCBpbnN0ZWFkIG9mIDAgdG8gZW5oYW5jZSBhY2N1cmFjeSBkdXJpbmcgY29uY2VhbG1lbnQuCiAgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGNvbmZvcm1hbmNlIGFuZCAjcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIHdpbGwKICBiZWNvbWUgbW9yZSBleHBlbnNpdmUuCiovCgojZGVmaW5lIEVYUF9CSVRTIDYKLyohPCBTaXplIG9mIGV4cG9uZW50LXBhcnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKHNob3VsZCBiZSBhdCBsZWFzdCA2KS4KICBUaGUgcmVtYWluaW5nIGJpdHMgaW4gZWFjaCB3b3JkIGFyZSB1c2VkIGZvciB0aGUgbWFudGlzc2EgKHNob3VsZCBiZSBhdCBsZWFzdCAxMCkuCiAgVGhpcyBmb3JtYXQgaXMgdXNlZCBpbiB0aGUgYXJyYXlzIGlFbnZlbG9wZVtdIGFuZCBzYnJOb2lzZUZsb29yTGV2ZWxbXQogIGluIHRoZSBGUkFNRV9EQVRBIHN0cnVjdCB3aGljaCBtdXN0IGZpdCBpbiBhIGNlcnRhaW4gcGFydCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgogIChTZWUgYnVmZmVyIG1hbmFnZW1lbnQgaW4gc2JyX2RlYy5jcHApLgogIEV4cG9uZW50cyBhbmQgbWFudGlzc2FzIGNvdWxkIGFsc28gYmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cy4KICBBY2Nlc3NpbmcgdGhlIGV4cG9uZW50IG9yIHRoZSBtYW50aXNzYSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCB0aGUgbWFza3MgI01BU0tfRQogIHJlc3AuICNNQVNLX00gd291bGQgICBubyBsb25nZXIgYmUgcmVxdWlyZWQuCiovCgojZGVmaW5lIE1BU0tfTSAoKCgxIDw8IChGUkFDVF9CSVRTIC0gRVhQX0JJVFMpKSAtIDEpIDw8IEVYUF9CSVRTKSAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwojZGVmaW5lIE1BU0tfRSAoKDEgPDwgRVhQX0JJVFMpIC0gMSkgICAgICAgICAgIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgZXhwb25lbnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KCiNkZWZpbmUgU0lHTl9FWFQgKCAoKFNDSEFSKS0xKSBeIE1BU0tfRSkgICAgICAgIC8qITwgYSBDSEFSLWNvbnN0YW50IHdpdGggYWxsIGJpdHMgYWJvdmUgb3VyIHNpZ24tYml0IHNldCAqLwojZGVmaW5lIFJPVU5ESU5HICggKEZJWFBfU0dMKSgxPDwoRVhQX0JJVFMtMSkpICkgLyohPCAwLjUtb2Zmc2V0IGZvciByb3VuZGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8tZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ3kncyBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KI2RlZmluZSBOT0lTRV9FWFBfT0ZGU0VUICAzOCAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIG5vaXNlIGxldmVsIGV4cG9uZW50IHRvIHByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLwoKdHlwZWRlZiBlbnVtCnsKICBIRUFERVJfTk9UX1BSRVNFTlQsCiAgSEVBREVSX0VSUk9SLAogIEhFQURFUl9PSywKICBIRUFERVJfUkVTRVQKfQpTQlJfSEVBREVSX1NUQVRVUzsKCnR5cGVkZWYgZW51bQp7CiAgU0JSX05PVF9JTklUSUFMSVpFRCA9IDAsCiAgVVBTQU1QTElORyA9IDEsCiAgU0JSX0hFQURFUiA9IDIsCiAgU0JSX0FDVElWRSA9IDMKfQpTQlJfU1lOQ19TVEFURTsKCgp0eXBlZGVmIGVudW0KewogIENPVVBMSU5HX09GRiA9IDAsCiAgQ09VUExJTkdfTEVWRUwsCiAgQ09VUExJTkdfQkFMCn0KQ09VUExJTkdfTU9ERTsKCnR5cGVkZWYgc3RydWN0CnsKICBVQ0hBUiBuU2ZiWzJdOyAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgU0JSLWJhbmRzIGZvciBsb3cgYW5kIGhpZ2ggZnJlcS1yZXNvbHV0aW9uICovCiAgVUNIQVIgbk5mYjsgICAgICAgICAgICAgIC8qITwgQWN0dWFsIG51bWJlciBvZiBub2lzZSBiYW5kcyB0byByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSovCiAgVUNIQVIgbnVtTWFzdGVyOyAgICAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBpbiB2X2tfbWFzdGVyICovCiAgVUNIQVIgbG93U3ViYmFuZDsgICAgICAgIC8qITwgUU1GLWJhbmQgd2hlcmUgU0JSIGZyZXF1ZW5jeSByYW5nZSBzdGFydHMgKi8KICBVQ0hBUiBoaWdoU3ViYmFuZDsgICAgICAgLyohPCBRTUYtYmFuZCB3aGVyZSBTQlIgZnJlcXVlbmN5IHJhbmdlIGVuZHMgKi8KICBVQ0hBUiBsaW1pdGVyQmFuZFRhYmxlW01BWF9OVU1fTElNSVRFUlMrMV07IC8qITwgTGltaXRlciBiYW5kIHRhYmxlLiAqLwogIFVDSEFSIG5vTGltaXRlckJhbmRzOyAgICAvKiE8IE51bWJlciBvZiBsaW1pdGVyIGJhbmRzLiAqLwogIFVDSEFSIG5JbnZmQmFuZHM7ICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBmb3IgaW52ZXJzZSBmaWx0ZXJpbmcgKi8KICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVsyXTsgLyohPCBQb2ludGVycyB0byBmcmVxQmFuZFRhYmxlTG8gYW5kIGZyZXFCYW5kVGFibGVIaSAqLwogIFVDSEFSIGZyZXFCYW5kVGFibGVMb1tNQVhfRlJFUV9DT0VGRlMvMisxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIGJhbmRzIHRvIFFNRiBiYW5kcyBmb3IgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiAgVUNIQVIgZnJlcUJhbmRUYWJsZUhpW01BWF9GUkVRX0NPRUZGUysxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIGJhbmRzIHRvIFFNRiBiYW5kcyBmb3IgaGlnaCBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogIFVDSEFSIGZyZXFCYW5kVGFibGVOb2lzZVtNQVhfTk9JU0VfQ09FRkZTKzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFwcGluZyBvZiBTQlIgbm9pc2UgYmFuZHMgdG8gUU1GIGJhbmRzICovCiAgVUNIQVIgdl9rX21hc3RlcltNQVhfRlJFUV9DT0VGRlMrMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgQmFuZFRhYmxlIHdoaWNoIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tICovCn0KRlJFUV9CQU5EX0RBVEE7Cgp0eXBlZGVmIEZSRVFfQkFORF9EQVRBICpIQU5ETEVfRlJFUV9CQU5EX0RBVEE7CgojZGVmaW5lIFNCUkRFQ19FTERfR1JJRCAgICAgICAgMQojZGVmaW5lIFNCUkRFQ19TWU5UQVhfU0NBTCAgICAgMgojZGVmaW5lIFNCUkRFQ19TWU5UQVhfVVNBQyAgICAgNAojZGVmaW5lIFNCUkRFQ19TWU5UQVhfUlNWRDUwICAgOAojZGVmaW5lIFNCUkRFQ19MT1dfUE9XRVIgICAgICAxNiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgTG93IFBvd2VyIFFNRiBtb2RlIHNoYWxsIGJlIHVzZWQuICovCiNkZWZpbmUgU0JSREVDX1BTX0RFQ09ERUQgICAgIDMyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBQUyB3YXMgZGVjb2RlZCBhbmQgcmVuZGVyZWQuICovCiNkZWZpbmUgU0JSREVDX0xEX01QU19RTUYgICAgNTEyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgTEQtTVBTIFFNRiBzaGFsbCBiZSB1c2VkLiAqLwojZGVmaW5lIFNCUkRFQ19TWU5UQVhfRFJNICAgMjA0OCAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgRFJNMzAvRFJNKyByZXZlcnNlIHN5bnRheCBpcyBiZWluZyB1c2VkLiAqLwojZGVmaW5lIFNCUkRFQ19ET1dOU0FNUExFICAgODE5MiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRvd25zYW1wbGluZyBtb2RlIGlzIHVzZWQuICovCiNkZWZpbmUgU0JSREVDX0ZMVVNIICAgICAgIDE2Mzg0ICAvKiBGbGFnIGlzIHVzZWQgdG8gZmx1c2ggYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KI2RlZmluZSBTQlJERUNfRk9SQ0VfUkVTRVQgMzI3NjggIC8qIEZsYWcgaXMgdXNlZCB0byBmb3JjZSBhIHJlc2V0IG9mIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCgojZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9SRVNFVCAgMQojZGVmaW5lIFNCUkRFQ19IRFJfU1RBVF9VUERBVEUgMgoKdHlwZWRlZiBzdHJ1Y3QgewogIFVDSEFSIGFtcFJlc29sdXRpb247ICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzICgwOiAxLjVkQiwgMTogM2RCKSAqLwogIFVDSEFSIHhvdmVyX2JhbmQ7ICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXggaW4gI3Zfa19tYXN0ZXJbXSB1c2VkIGZvciBkeW5hbWljIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KICBVQ0hBUiBzYnJfcHJlcHJvY2Vzc2luZzsgICAvKiE8IFNCUiBwcmV3aGl0ZW5pbmcgZmxhZy4gKi8KfSBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTzsKCnR5cGVkZWYgc3RydWN0IHsKICAvKiBDaGFuZ2VzIGluIHRoZXNlIHZhcmlhYmxlcyBjYXVzZXMgYSByZXNldCBvZiB0aGUgZGVjb2RlciAqLwogIFVDSEFSIHN0YXJ0RnJlcTsgICAgICAgICAgIC8qITwgSW5kZXggZm9yIFNCUiBzdGFydCBmcmVxdWVuY3kgKi8KICBVQ0hBUiBzdG9wRnJlcTsgICAgICAgICAgICAvKiE8IEluZGV4IGZvciBTQlIgaGlnaGVzdCBmcmVxdWVuY3kgKi8KICBVQ0hBUiBmcmVxU2NhbGU7ICAgICAgICAgICAvKiE8IDA6IGxpbmVhciBzY2FsZSwgIDEtMyBsb2dhcml0aG1pYyBzY2FsZXMgKi8KICBVQ0hBUiBhbHRlclNjYWxlOyAgICAgICAgICAvKiE8IEZsYWcgZm9yIGNvYXJzZXIgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICBVQ0hBUiBub2lzZV9iYW5kczsgICAgICAgICAvKiE8IE5vaXNlIGJhbmRzIHBlciBvY3RhdmUsIHJlYWQgZnJvbSBiaXRzdHJlYW0qLwoKICAvKiBkb24ndCByZXF1aXJlIHJlc2V0ICovCiAgVUNIQVIgbGltaXRlckJhbmRzOyAgICAgICAgLyohPCBJbmRleCBmb3IgbnVtYmVyIG9mIGxpbWl0ZXIgYmFuZHMgcGVyIG9jdGF2ZSAqLwogIFVDSEFSIGxpbWl0ZXJHYWluczsgICAgICAgIC8qITwgSW5kZXggdG8gc2VsZWN0IGdhaW4gbGltaXQgKi8KICBVQ0hBUiBpbnRlcnBvbEZyZXE7ICAgICAgICAvKiE8IFNlbGVjdCBnYWluIGNhbGN1bGF0aW9uIG1ldGhvZCAoMTogcGVyIFFNRiBjaGFubmVsLCAwOiBwZXIgU0JSIGJhbmQpICovCiAgVUNIQVIgc21vb3RoaW5nTGVuZ3RoOyAgICAgLyohPCBTbW9vdGhpbmcgb2YgZ2FpbnMgb3ZlciB0aW1lICgwOiBvbiAgMTogb2ZmKSAqLwoKfSBTQlJfSEVBREVSX0RBVEFfQlM7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgU0JSX1NZTkNfU1RBVEUgc3luY1N0YXRlOyAgICAvKiE8IFRoZSBjdXJyZW50IGluaXRpYWxpemF0aW9uIHN0YXR1cyBvZiB0aGUgaGVhZGVyICovCgogIFVDSEFSIHN0YXR1czsgICAgICAgICAgICAgICAgLyohPCBGbGFncyBmaWVsZCB1c2VkIGZvciBzaWduYWxpbmcgYSByZXNldCByaWdodCBiZWZvcmUgdGhlIHByb2Nlc3Npbmcgc3RhcnRzIGFuZCBhbiB1cGRhdGUgZnJvbSBjb25maWcgKGUuZy4gQVNDKS4gKi8KICBVQ0hBUiBmcmFtZUVycm9yRmxhZzsgICAgICAgIC8qITwgRnJhbWUgZGF0YSB2YWxpZCBmbGFnLiBDQVVUSU9OOiBUaGlzIHZhcmlhYmxlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGZsYWcgc3RvcmVkIGluIHRoZSBlbGVtZW50IHN0cnVjdHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvZiB0aGUgZnJhbWUgZGVsYXkuIFRoZXJlIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IGRpZmZlcmVudCBzbG90cyB1c2UgdGhlIHNhbWUgaGVhZGVyLiAqLwogIFVDSEFSIG51bWJlclRpbWVTbG90czsgICAgICAgLyohPCBBQUM6IDE2LDE1ICovCiAgVUNIQVIgbnVtYmVyT2ZBbmFseXNpc0JhbmRzOyAvKiE8IE51bWJlciBvZiBRTUYgYW5hbHlzaXMgYmFuZHMgKi8KICBVQ0hBUiB0aW1lU3RlcDsgICAgICAgICAgICAgIC8qITwgVGltZSByZXNvbHV0aW9uIG9mIFNCUiBpbiBRTUYtc2xvdHMgKi8KICBVSU5UICBzYnJQcm9jU21wbFJhdGU7ICAgICAgIC8qITwgU0JSIHByb2Nlc3Npbmcgc2FtcGxpbmcgZnJlcXVlbmN5ICghPSBPdXRwdXRTYW1wbGluZ1JhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWx3YXlzOiBDb3JlU2FtcGxpbmdSYXRlICogVXBTYW1wbGluZ0ZhY3RvcjsgZXZlbiBpbiBzaW5nbGUgcmF0ZSBtb2RlKSAqLwoKICBTQlJfSEVBREVSX0RBVEFfQlMgICAgICBic19kYXRhOyAgLyohPCBjdXJyZW50IFNCUiBoZWFkZXIuICovCiAgU0JSX0hFQURFUl9EQVRBX0JTX0lORk8gYnNfaW5mbzsgIC8qITwgU0JSIGluZm8uICovCgogIEZSRVFfQkFORF9EQVRBIGZyZXFCYW5kRGF0YTsgIC8qITwgUG9pbnRlciB0byBzdHJ1Y3QgI0ZSRVFfQkFORF9EQVRBICovCn0KU0JSX0hFQURFUl9EQVRBOwoKdHlwZWRlZiBTQlJfSEVBREVSX0RBVEEgKkhBTkRMRV9TQlJfSEVBREVSX0RBVEE7CgoKdHlwZWRlZiBzdHJ1Y3QKewogIFVDSEFSIGZyYW1lQ2xhc3M7ICAgICAgICAgICAgICAgLyohPCBTZWxlY3QgZ3JpZCB0eXBlICovCiAgVUNIQVIgbkVudmVsb3BlczsgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBlbnZlbG9wZXMgKi8KICBVQ0hBUiBib3JkZXJzW01BWF9FTlZFTE9QRVMrMV07IC8qITwgRW52ZWxvcGUgYm9yZGVycyAoaW4gU0JSLXRpbWVzbG90cywgZS5nLiBtcDNQUk86IDAuLjExKSAqLwogIFVDSEFSIGZyZXFSZXNbTUFYX0VOVkVMT1BFU107ICAgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgZWFjaCBlbnZlbG9wZSAoMD1sb3csIDE9aGlnaCkgKi8KICBTQ0hBUiAgdHJhbkVudjsgICAgICAgICAgICAgICAgIC8qITwgVHJhbnNpZW50IGVudmVsb3BlLCAtMSBpZiBub25lICovCiAgVUNIQVIgbk5vaXNlRW52ZWxvcGVzOyAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBlbnZlbG9wZXMgKi8KICBVQ0hBUiBib3JkZXJzTm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFUysxXTsvKiE8IGJvcmRlcnMgb2Ygbm9pc2UgZW52ZWxvcGVzICovCn0KRlJBTUVfSU5GTzsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgRklYUF9TR0wgc2ZiX25yZ19wcmV2W01BWF9GUkVRX0NPRUZGU107ICAgIC8qITwgUHJldmlvdXMgZW52ZWxvcGUgKHJlcXVpcmVkIGZvciBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLwogIEZJWFBfU0dMIHByZXZOb2lzZUxldmVsW01BWF9OT0lTRV9DT0VGRlNdOyAvKiE8IFByZXZpb3VzIG5vaXNlIGVudmVsb3BlIChyZXF1aXJlZCBmb3IgZGlmZmVyZW50aWFsLWNvZGVkIHZhbHVlcykgKi8KICBDT1VQTElOR19NT0RFIGNvdXBsaW5nOyAgICAgICAgICAgICAgICAgICAgLyohPCBTdGVyZW8tbW9kZSBvZiBwcmV2aW91cyBmcmFtZSAqLwogIElOVkZfTU9ERSBzYnJfaW52Zl9tb2RlW01BWF9JTlZGX0JBTkRTXTsgICAvKiE8IFByZXZpb3VzIHN0cmVuZ3RoIG9mIGZpbHRlcmluZyBpbiB0cmFuc3Bvc2VyICovCiAgVUNIQVIgYW1wUmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJldmlvdXMgYW1wbGl0dWRlIHJlc29sdXRpb24gKDA6IDEuNWRCLCAxOiAzZEIpICovCiAgVUNIQVIgc3RvcFBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgUG9zaXRpb24gaW4gdGltZSB3aGVyZSBsYXN0IGVudmVsb3BlIGVuZGVkICovCiAgVUNIQVIgZnJhbWVFcnJvckZsYWc7ICAgICAgICAgICAgICAgICAgICAgIC8qITwgUHJldmlvdXMgZnJhbWUgc3RhdHVzICovCn0KU0JSX1BSRVZfRlJBTUVfREFUQTsKCnR5cGVkZWYgU0JSX1BSRVZfRlJBTUVfREFUQSAqSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEE7CgoKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBuU2NhbGVGYWN0b3JzOyAgICAgICAgICAgICAgICAgICAgLyohPCB0b3RhbCBudW1iZXIgb2Ygc2NhbGVmYWN0b3JzIGluIGZyYW1lICovCgogIEZSQU1FX0lORk8gZnJhbWVJbmZvOyAgICAgICAgICAgICAgICAgLyohPCB0aW1lIGdyaWQgZm9yIGN1cnJlbnQgZnJhbWUgKi8KICBVQ0hBUiBkb21haW5fdmVjW01BWF9FTlZFTE9QRVNdOyAgICAgIC8qITwgQml0ZmllbGQgY29udGFpbmluZyBkaXJlY3Rpb24gb2YgZGVsdGEtY29kaW5nIGZvciBlYWNoIGVudmVsb3BlICgwOmZyZXF1ZW5jeSwgMTp0aW1lKSAqLwogIFVDSEFSIGRvbWFpbl92ZWNfbm9pc2VbTUFYX05PSVNFX0VOVkVMT1BFU107IC8qITwgU2FtZSBhcyBhYm92ZSwgYnV0IGZvciBub2lzZSBlbnZlbG9wZXMgKi8KCiAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAvKiE8IFN0cmVuZ3RoIG9mIGZpbHRlcmluZyBpbiB0cmFuc3Bvc2VyICovCiAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsgICAgICAgICAgICAgICAgICAvKiE8IFN0ZXJlby1tb2RlICovCiAgaW50IGFtcFJlc29sdXRpb25DdXJyZW50RnJhbWU7ICAgICAgICAgICAvKiE8IEFtcGxpdHVkZSByZXNvbHV0aW9uIG9mIGVudmVsb3BlIHZhbHVlcyAoMDogMS41ZEIsIDE6IDNkQikgKi8KCiAgVUNIQVIgYWRkSGFybW9uaWNzW01BWF9GUkVRX0NPRUZGU107ICAgICAvKiE8IEZsYWdzIGZvciBzeW50aGV0aWMgc2luZSBhZGRpdGlvbiAqLwoKICBGSVhQX1NHTCBpRW52ZWxvcGVbTUFYX05VTV9FTlZFTE9QRV9WQUxVRVNdOyAgICAgICAvKiE8IEVudmVsb3BlIGRhdGEgKi8KICBGSVhQX1NHTCBzYnJOb2lzZUZsb29yTGV2ZWxbTUFYX05VTV9OT0lTRV9WQUxVRVNdOyAvKiE8IE5vaXNlIGVudmVsb3BlIGRhdGEgKi8KfQpTQlJfRlJBTUVfREFUQTsKCnR5cGVkZWYgU0JSX0ZSQU1FX0RBVEEgKkhBTkRMRV9TQlJfRlJBTUVfREFUQTsKCnZvaWQgaW5pdFNiclByZXZGcmFtZURhdGEgKEhBTkRMRV9TQlJfUFJFVl9GUkFNRV9EQVRBIGhfcHJldl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZVNsb3RzKTsKCgppbnQgc2JyR2V0U2luZ2xlQ2hhbm5lbEVsZW1lbnQgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDIGhQYXJhbWV0cmljU3RlcmVvRGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKaW50IHNickdldENoYW5uZWxQYWlyRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBICBoRnJhbWVEYXRhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJpdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwKTsKClNCUl9IRUFERVJfU1RBVFVTCnNickdldEhlYWRlckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAogICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIGZJc1NickRhdGEpOwoKLyohCiAgXGJyaWVmICAgICBJbml0aWFsaXplIFNCUiBoZWFkZXIgZGF0YQoKICBDb3B5IGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBoZWFkZXIgZGF0YSBzdHJ1Y3QgYW5kIHBhdGNoIHNvbWUgZW50cmllcwogIGRlcGVuZGluZyBvbiB0aGUgY29yZSBjb2RlYy4KKi8KU0JSX0VSUk9SCmluaXRIZWFkZXJEYXRhICgKICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBoSGVhZGVyRGF0YSwKICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlSW4sCiAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgc2FtcGxlUmF0ZU91dCwKICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUsCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgZmxhZ3MKICAgICAgICApOwojZW5kaWYK