Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKToKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBcZmlsZSAgIG1hY2hpbmVfdHlwZS5oCiAqICBcYnJpZWYgIFR5cGUgZGVmaW5lcyBmb3IgdmFyaW91cyBwcm9jZXNzb3JzIGFuZCBjb21waWxlciB0b29scy4KICovCgojaWYgIWRlZmluZWQoX19NQUNISU5FX1RZUEVfSF9fKQojZGVmaW5lIF9fTUFDSElORV9UWVBFX0hfXwoKCi8qIExpYnJhcnkgY2FsbGluZyBjb252ZW50aW9uIHNwZWMuIF9fY2RlY2wgYW5kIGZyaWVuZHMgbWlnaHQgYmUgYWRkZWQgaGVyZSBhcyByZXF1aXJlZC4gKi8KICAjZGVmaW5lIExJTktTUEVDX0gKICAjZGVmaW5lIExJTktTUEVDX0NQUAoKCi8qKgogKiAgY29sbGF0ZSBhbGwgY29ycmVzcG9uZGluZyBjb21waWxlciBzcGVjaWZpYyBtYWNyb3MgdG8gZGV0ZWN0IGEgZGVidWcgYnVpbGQsIGFuZCBzZXQgdGhlIERFQlVHIG1hY3JvIGlmIHRoYXQgaXMgdGhlIGNhc2UuCiAqLwojaWYgZGVmaW5lZChfREVCVUcpCiNkZWZpbmUgREVCVUcKI2VuZGlmCgoKLyogZm9yIGRveHlnZW4gdGhlIGZvbGxvd2luZyBkb2N1IHBhcnRzIG11c3QgYmUgc2VwYXJhdGVkICovCi8qKiBcdmFyICBTQ0hBUgogKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyBhdCBsZWFzdCAxIGJ5dGUgc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCiAqLwovKiogXHZhciAgVUNIQVIKICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgYXQgbGVhc3QgMSBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCiAqLwovKiogXHZhciAgSU5UCiAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KICovCi8qKiBcdmFyICBVSU5UCiAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIGF0IGxlYXN0IDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgogKi8KLyoqIFx2YXIgIExPTkcKICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgNCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgogKi8KLyoqIFx2YXIgIFVMT05HCiAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDQgYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgogKi8KLyoqIFx2YXIgIFNIT1JUCiAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIDIgYnl0ZSBzaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KICovCi8qKiBcdmFyICBVU0hPUlQKICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgMiBieXRlIHVuc2lnbmVkIGludGVnZXIgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCiAqLwovKiogXHZhciAgSU5UNjQKICogICAgICAgIERhdGEgdHlwZSByZXByZXNlbnRpbmcgOCBieXRlIHNpZ25lZCBpbnRlZ2VyIG9uIGFsbCBzdXBwb3J0ZWQgcGxhdGZvcm1zLgogKi8KLyoqIFx2YXIgIFVJTlQ2NAogKiAgICAgICAgRGF0YSB0eXBlIHJlcHJlc2VudGluZyA4IGJ5dGUgdW5zaWduZWQgaW50ZWdlciBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KICovCi8qKiBcZGVmICBTSE9SVF9CSVRTCiAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIHNob3J0IHJlcHJlc2VudHMuIHNpemVvZigpIGlzIG5vdCBzdWl0ZWQgdG8gZ2V0IHRoaXMgaW5mbywKICogICAgICAgIGJlY2F1c2UgYSBieXRlIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBhcyA4IGJpdHMuCiAqLwovKiogXGRlZiAgQ0hBUl9CSVRTCiAqICAgICAgICBOdW1iZXIgb2YgYml0cyB0aGUgZGF0YSB0eXBlIGNoYXIgcmVwcmVzZW50cy4gc2l6ZW9mKCkgaXMgbm90IHN1aXRlZCB0byBnZXQgdGhpcyBpbmZvLAogKiAgICAgICAgYmVjYXVzZSBhIGJ5dGUgaXMgbm90IGFsd2F5cyBkZWZpbmVkIGFzIDggYml0cy4KICovCi8qKiBcdmFyICBJTlRfUENNCiAqICAgICAgICBEYXRhIHR5cGUgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCBvZiBpbnB1dCBhbmQgb3V0cHV0IFBDTSBzYW1wbGVzLgogKi8KCgogIHR5cGVkZWYgc2lnbmVkIGludCBJTlQ7CiAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKI2lmZGVmIF9fTFA2NF9fCiAgLyogZm9yY2UgRkRLIGxvbmctZGF0YXR5cGVzIHRvIDQgYnl0ZSAgKi8KICAvKiBqZHI6IFVzZSBkZWZpbmVzIHRvIGF2b2lkIHR5cGUgYWxpYXMgcHJvYmxlbXMgb24gNjQgYml0IG1hY2hpbmVzLiAqLwogICNkZWZpbmUgTE9ORyBJTlQKICAjZGVmaW5lIFVMT05HIFVJTlQKI2Vsc2UgLyogX19MUDY0X18gKi8KICB0eXBlZGVmIHNpZ25lZCBsb25nIExPTkc7CiAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMT05HOwojZW5kaWYJLyogX19MUDY0X18gKi8KICB0eXBlZGVmIHNpZ25lZCBzaG9ydCBTSE9SVDsKICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTSE9SVDsKICB0eXBlZGVmIHNpZ25lZCBjaGFyIFNDSEFSOwogIHR5cGVkZWYgdW5zaWduZWQgY2hhciBVQ0hBUjsKCiAgI2RlZmluZSBTSE9SVF9CSVRTIDE2CiAgI2RlZmluZSBDSEFSX0JJVFMgOAoKCi8qIERlZmluZSA2NCBiaXQgYmFzZSBpbnRlZ2VyIHR5cGUuICovCiNpZmRlZiBfTVNDX1ZFUgogIHR5cGVkZWYgX19pbnQ2NCBJTlQ2NDsKICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVUlOVDY0OwojZWxzZQogIHR5cGVkZWYgbG9uZyBsb25nIElOVDY0OwogIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsKI2VuZGlmCgojaWZuZGVmIE5VTEwKICAjaWZkZWYgX19jcGx1c3BsdXMKICAgICNkZWZpbmUgTlVMTCAgICAwCiAgI2Vsc2UKICAgICNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQogICNlbmRpZgojZW5kaWYKCi8qIEFzc2VydCBpcyBmdW5jdGlvbmFsIG9uIHg4NiBQQydzIGFuZCBhbHNvIHdoZW4gZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4gKi8KI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX19pNjg2X18pIHx8IGRlZmluZWQoX19pNTg2X18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKEZES19ERUJVRykgfHwgZGVmaW5lZChGREtfQVNTRVJUX0VOQUJMRSkKICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAgI2RlZmluZSBGREtfQVNTRVJUKHgpIGFzc2VydCh4KQojZWxzZQogICNkZWZpbmUgRkRLX0FTU0VSVChpZ25vcmUpCiNlbmRpZgoKICB0eXBlZGVmIFNIT1JUICAgICAgICBJTlRfUENNOwogICNkZWZpbmUgV0FWX0JJVFMgICAgIDE2CiAgI2RlZmluZSBTQU1QTEVfQklUUyAgMTYKICAjZGVmaW5lIFNBTVBMRV9NQVggKCgoTE9ORykxPDwoU0FNUExFX0JJVFMtMSkpLTEpCiAgI2RlZmluZSBTQU1QTEVfTUlOICh+U0FNUExFX01BWCkKCi8qIQoqIFxkZWYgICAgUkFNX0FMSUdOCiogIFVzZWQgdG8gYWxpZ24gbWVtb3J5IGFzIHByZWZpeCBiZWZvcmUgbWVtb3J5IGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZToKICAgXGNvZGUKICAgUkFNX0FMSUdOCiAgIGludCBteUFycmF5WzE2XTsKICAgXGVuZGNvZGUKCiAgIE5vdGUsIHRoYXQgbm90IGFsbCBwbGF0Zm9ybXMgc3VwcG9ydCB0aGlzIG1lY2hhbmlzbS4gRm9yIGV4YW1wbGUgd2l0aCBUSSBjb21waWxlcnMKICAgYSBwcmVwcm9jZXNzb3IgcHJhZ21hIGlzIHVzZWQsIGJ1dCB0byBkbyBzb21ldGhpbmcgbGlrZQoKICAgXGNvZGUKICAgI2RlZmluZSBSQU1fQUxJR04gI3ByYWdtYSBEQVRBX0FMSUdOKHgpCiAgIFxlbmNvZGUKCiAgIHdvdWxkIHJlcXVpcmUgdGhlIHByZXByb2Nlc3NvciB0byBwcm9jZXNzIHRoaXMgbGluZSB0d2ljZSB0byBmdWxseSByZXNvbHZlIGl0LiBIZW5jZSwKICAgYSBmdWxseSBwbGF0Zm9ybS1pbmRlcGVuZGFudCB3YXkgdG8gdXNlIGFsaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkLgoKKiBcZGVmICAgIEFMSUdOTUVOVF9ERUZBVUxUCiogICAgICAgICBEZWZhdWx0IGFsaWdubWVudCBpbiBieXRlcy4KKi8KI2lmIGRlZmluZWQoX19HTlVDX18pCS8qIGNwcHAgcmVwbGFjZWQ6IGVsaWYgKi8KICAjZGVmaW5lIEFMSUdOTUVOVF9ERUZBVUxUIDgKICAjZGVmaW5lIFJBTV9BTElHTiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKEFMSUdOTUVOVF9ERUZBVUxUKSkpCiNlbHNlCiAgI2RlZmluZSBBTElHTk1FTlRfREVGQVVMVCA4CiAgI2RlZmluZSBSQU1fQUxJR04KI2VuZGlmCgoKLyohCiogXGRlZiAgUkVTVFJJQ1QKKiAgICAgICBUaGUgcmVzdHJpY3Qga2V5d29yZCBpcyBzdXBwb3J0ZWQgYnkgc29tZSBwbGF0Zm9ybXMgYW5kIFJFU1RSSUNUIG1hcHMgdG8KKiAgICAgICBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZCBvbiBlYWNoIHBsYXRmb3JtIG9yIHRvIHZvaWQgaWYgdGhlCiogICAgICAgY29tcGlsZXIgZG9lcyBub3QgcHJvdmlkZSBzdWNoIGZlYXR1cmUuCioKKiBcZGVmICBXT1JEX0FMSUdORUQoeCkKKiAgICAgICBUZWxscyB0aGUgY29tcGlsZXIgdGhhdCBwb2ludGVyIHggaXMgV09SRCBhbGlnbmVkLgoqICAgICAgIEF0IHRoZSBtb21lbnQgb25seSBzdXBwb3J0ZWQgYnkgVEkgY29tcGlsZXJzLgoqCiogXGRlZiAgRFdPUkRfQUxJR05FRCh4KQoqICAgICAgIFRlbGxzIHRoZSBjb21waWxlciB0aGF0IHBvaW50ZXIgeCBpcyBEV09SRCBhbGlnbmVkLgoqICAgICAgIEF0IHRoZSBtb21lbnQgb25seSBzdXBwb3J0ZWQgYnkgVEkgY29tcGlsZXJzLgoqLwogICNkZWZpbmUgUkVTVFJJQ1QKICAjZGVmaW5lIFdPUkRfQUxJR05FRCh4KQogICNkZWZpbmUgRFdPUkRfQUxJR05FRCh4KQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQUxJR05fU0laRQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyohCiAqIFxicmllZiAgVGhpcyBtYWNybyBhbGlnbnMgYSBnaXZlbiB2YWx1ZSBkZXBlbmRpbmcgb24gOjpBTElHTk1FTlRfREVGQVVMVC4KICoKICogRm9yIGV4YW1wbGUgaWYgI0FMSUdOTUVOVF9ERUZBVUxUIGVxdWFscyA4LCB0aGVuOgogKiAtIEFMSUdOX1NJWkUoMykgcmV0dXJucyA4CiAqIC0gQUxJR05fU0laRSg4KSByZXR1cm5zIDgKICogLSBBTElHTl9TSVpFKDkpIHJldHVybnMgMTYKICovCiNkZWZpbmUgQUxJR05fU0laRShhKSAoKGEpKyAoKChJTlQpQUxJR05NRU5UX0RFRkFVTFQgLSAoKElOVCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpKQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBBTElHTl9QVFIKICogY2FzdCAoYSkgdG8gd2lkdGggb2YgcG9pbnRlcgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyohCiAqIFxicmllZiAgVGhpcyBtYWNybyBhbGlnbnMgYSBnaXZlbiBhZGRyZXNzIGRlcGVuZGluZyBvbiA6OkFMSUdOTUVOVF9ERUZBVUxULgogKi8KI2RlZmluZSBBTElHTl9QVFIoYSkgKCAodW5zaWduZWQgY2hhciopKGEpICsgKCgoSU5UKUFMSUdOTUVOVF9ERUZBVUxUIC0gKChJTlQpKFVJTlQ2NCkoYSkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkgJiAoQUxJR05NRU5UX0RFRkFVTFQtMSkpICkKCiAvKiBBbGlnbm1lbnQgbWFjcm8gZm9yIGxpYlNZUyBoZWFwIGltcGxlbWVudGF0aW9uICovCiNkZWZpbmUgQUxJR05NRU5UX0VYVFJFUyAgICAoIEFMSUdOTUVOVF9ERUZBVUxUICkKI2RlZmluZSBBTEdOX1NJWkVfRVhUUkVTKGEpICgoYSkrICgoKElOVClBTElHTk1FTlRfRVhUUkVTIC0gKChJTlQpKGEpICYgKEFMSUdOTUVOVF9FWFRSRVMtMSkpICkgJiAoQUxJR05NRU5UX0VYVFJFUy0xKSkpCgoKLyohCiAqIFxkZWYgIEZPUkNFSU5MSU5FCiAqICAgICAgIFNvbWV0aW1lcyBjb21waWxlciBkbyBub3QgZG8gd2hhdCB0aGV5IGFyZSB0b2xkIHRvIGRvLCBhbmQgaW4gY2FzZSBvZiBpbmxpbmluZyBzb21lCiAqICAgICAgIGFkZGl0aW9uYWwgY29tbWFuZCBtaWdodCBiZSBuZWNlc3NhcnkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KICoKICogXGRlZiAgRkRLX0lOTElORQogKiAgICAgICBEZWZpbmVzIGhvdyB0aGUgY29tcGlsZXIgaXMgdG9sZCB0byBpbmxpbmUgc3R1ZmYuCiAqLwojaWZkZWYgREVCVUcKI3VuZGVmIEZPUkNFSU5MSU5FCiNkZWZpbmUgRk9SQ0VJTkxJTkUKI2Vsc2UKI2lmbmRlZiBGT1JDRUlOTElORQogICNpZiBkZWZpbmVkKF9fR05VQ19fKQkvKiBjcHBwIHJlcGxhY2VkOiBlbGlmICovCiAgICAjZGVmaW5lIEZPUkNFSU5MSU5FIF9fYXR0cmlidXRlKChhbHdheXNfaW5saW5lKSkKICAjZWxzZQogICAgI2RlZmluZSBGT1JDRUlOTElORQogICNlbmRpZgojZW5kaWYKI2VuZGlmCgogIC8qIGZvciBhbGwgb3RoZXIgcGxhdGZvcm1zICovCiAgI2RlZmluZSBGREtfSU5MSU5FIGlubGluZQoKCi8qIQogKiBcZGVmICBMTktfU0VDVElPTl9EQVRBX0wxCiAqICAgICAgIFRoZSBMTktfU0VDVElPTl8qIGRlZmluZXMgYWxsb3cgbWVtb3J5IHRvIGJlIGRyYXduIGZyb20gc3BlY2lmaWMgbWVtb3J5CiAqICAgICAgIHNlY3Rpb25zLiBVc2VkIGFzIHByZWZpeCBiZWZvcmUgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAqCiAqIFxkZWYgIExOS19TRUNUSU9OX0RBVEFfTDIKICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQogKiBcZGVmICBMTktfU0VDVElPTl9MMV9EQVRBX0EKICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQogKiBcZGVmICBMTktfU0VDVElPTl9MMV9EQVRBX0IKICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQogKiBcZGVmICBMTktfU0VDVElPTl9DT05TVERBVEFfTDEKICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQogKiBcZGVmICBMTktfU0VDVElPTl9DT05TVERBVEEKICogICAgICAgU2VlIDo6TE5LX1NFQ1RJT05fREFUQV9MMQogKiBcZGVmICBMTktfU0VDVElPTl9DT0RFX0wxCiAqICAgICAgIFNlZSA6OkxOS19TRUNUSU9OX0RBVEFfTDEKICogXGRlZiAgTE5LX1NFQ1RJT05fQ09ERV9MMgogKiAgICAgICBTZWUgOjpMTktfU0VDVElPTl9EQVRBX0wxCiAqIFxkZWYgIExOS19TRUNUSU9OX0lOSVRDT0RFCiAqICAgICAgIFNlZSA6OkxOS19TRUNUSU9OX0RBVEFfTDEKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb2RlIFNlY3Rpb24gbWFjcm9zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDEKICAjZGVmaW5lIExOS19TRUNUSU9OX0NPREVfTDIKICAjZGVmaW5lIExOS19TRUNUSU9OX0lOSVRDT0RFCgovKiBNZW1vcnkgc2VjdGlvbiBtYWNyb3MuICovCgogIC8qIGRlZmF1bHQgZmFsbCBiYWNrICovCiAgI2RlZmluZSBMTktfU0VDVElPTl9EQVRBX0wxCiAgI2RlZmluZSBMTktfU0VDVElPTl9EQVRBX0wyCiAgI2RlZmluZSBMTktfU0VDVElPTl9DT05TVERBVEEKICAjZGVmaW5lIExOS19TRUNUSU9OX0NPTlNUREFUQV9MMQoKICAjZGVmaW5lIExOS19TRUNUSU9OX0wxX0RBVEFfQQogICNkZWZpbmUgTE5LX1NFQ1RJT05fTDFfREFUQV9CCgoKI2lmZGVmIF9NU0NfVkVSCiAgLyoKICAgKiBTb21ldGltZXMgY2VydGFpbiBmZWF0dXJlcyBhcmUgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiBhbmQgdGhlcmVmb3JlIHRoZSB3YXJuaW5nIDQwNjUgbWF5IG9jY3VyOgogICAqICJzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscyIKICAgKiBXZSBjb25zaWRlciB0aGlzIHdhcm5pbmcgaXJyZWxldmFudCBhbmQgZGlzYWJsZSBpdC4KICAgKi8KICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MDY1ICkKI2VuZGlmCgojZW5kaWYgLyogX19NQUNISU5FX1RZUEVfSF9fICovCg==