Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogTWFya3VzIExvaHdhc3NlcgogICBEZXNjcmlwdGlvbjogRkRLIFRvb2xzIEh5YnJpZCBGaWx0ZXJiYW5rCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIF9fRkRLX0hZQlJJRF9ICiNkZWZpbmUgX19GREtfSFlCUklEX0gKCgoKI2luY2x1ZGUgImNvbW1vbl9maXguaCIKCi8qLS0tLS0tLS0tLS0tLS0tIGVudW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqCiAqIEh5YnJpZCBGaWx0ZXJiYW5kIG1vZGVzLgogKi8KdHlwZWRlZiBlbnVtIHsKICAgIFRIUkVFX1RPX1RFTiwKICAgIFRIUkVFX1RPX1RXRUxWRSwKICAgIFRIUkVFX1RPX1NJWFRFRU4KCn0gRkRLX0hZQlJJRF9NT0RFOwoKCi8qLS0tLS0tLS0tLS0tLS0tIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLwp0eXBlZGVmIHN0cnVjdCBGREtfSFlCUklEX1NFVFVQICpIQU5ETEVfRkRLX0hZQlJJRF9TRVRVUDsKCnR5cGVkZWYgc3RydWN0CnsKICBGSVhQX0RCTCAgICAgICAgICAgICAqYnVmZmVyTEZSZWFsWzNdOyAgICAgLyohPCBMRiByZWFsIGZpbHRlciBzdGF0ZXMuICovCiAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckxGSW1hZ1szXTsgICAgIC8qITwgTEYgaW1hZyBmaWx0ZXIgc3RhdGVzLiAqLwogIEZJWFBfREJMICAgICAgICAgICAgICpidWZmZXJIRlJlYWxbMTNdOyAgICAvKiE8IEhGIHJlYWwgZGVsYXkgbGluZXMuICovCiAgRklYUF9EQkwgICAgICAgICAgICAgKmJ1ZmZlckhGSW1hZ1sxM107ICAgIC8qITwgSEYgaW1hZyBkZWxheSBsaW5lcy4gKi8KCiAgSU5UICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxGcG9zOyAgICAgICAgIC8qITwgUG9zaXRpb24gdG8gd3JpdGUgaW5jb21pbmcgZGF0YSBpbnRvIHJpbmdidWZmZXIuICovCiAgSU5UICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhGcG9zOyAgICAgICAgIC8qITwgRGVsYXkgbGluZSBwb3NpdGlvbmluZy4gKi8KICBJTlQgICAgICAgICAgICAgICAgICAgbnJCYW5kczsgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgUU1GIGJhbmRzLiAqLwogIElOVCAgICAgICAgICAgICAgICAgICBjcGx4QmFuZHM7ICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb21wbGV4IFFNRiBiYW5kcy4qLwogIFVDSEFSICAgICAgICAgICAgICAgICBoZk1vZGU7ICAgICAgICAgICAgICAvKiE8IEZsYWcgc2lnbmFsaXplcyB0cmVhdG1lbnQgb2YgSEYgYmFuZHMuICovCgogIEZJWFBfREJMICAgICAgICAgICAgICpwTEZtZW1vcnk7ICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gTEYgc3RhdGVzIGJ1ZmZlci4gKi8KICBGSVhQX0RCTCAgICAgICAgICAgICAqcEhGbWVtb3J5OyAgICAgICAgICAgLyohPCBQb2ludGVyIHRvIEhGIHN0YXRlcyBidWZmZXIuICovCgogIFVJTlQgICAgICAgICAgICAgICAgICBMRm1lbW9yeVNpemU7ICAgICAgICAvKiE8IFNpemUgb2YgTEYgc3RhdGVzIGJ1ZmZlci4gKi8KICBVSU5UICAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplOyAgICAgICAgLyohPCBTaXplIG9mIEhGIHN0YXRlcyBidWZmZXIuICovCgogIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLwoKfSBGREtfQU5BX0hZQl9GSUxURVI7CgoKdHlwZWRlZiBzdHJ1Y3QKewogIElOVCAgICAgICAgICAgICAgICAgICBuckJhbmRzOyAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBRTUYgYmFuZHMuICovCiAgSU5UICAgICAgICAgICAgICAgICAgIGNwbHhCYW5kczsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGNvbXBsZXggUU1GIGJhbmRzLiovCgogIEhBTkRMRV9GREtfSFlCUklEX1NFVFVQIHBTZXR1cDsgICAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gZmlsdGVyIHNldHVwLiAqLwoKfSBGREtfU1lOX0hZQl9GSUxURVI7Cgp0eXBlZGVmIEZES19BTkFfSFlCX0ZJTFRFUiAqSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUjsKdHlwZWRlZiBGREtfU1lOX0hZQl9GSUxURVIgKkhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVI7CgoKLyoqCiAqIFxicmllZiAgQ3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBIeWJyaWQgQW5hbHlpcyBGaWx0ZXJiYW5rLgogKgogKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBQb2ludGVyIHRvIGFuIG91dGx5aW5nIGFsbG9jYXRlZCBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBzdHJ1Y3R1cmUuCiAqIFxwYXJhbSBwTEZtZW1vcnkgICAgICAgICAgIFBvaW50ZXIgdG8gb3V0bHlpbmcgYnVmZmVyIHVzZWQgTEYgZmlsdGVyaW5nLgogKiBccGFyYW0gTEZtZW1vcnlTaXplICAgICAgICBTaXplIG9mIHBMRm1lbW9yeSBpbiBieXRlcy4KICogXHBhcmFtIHBIRm1lbW9yeSAgICAgICAgICAgUG9pbnRlciB0byBvdXRseWluZyBidWZmZXIgdXNlZCBIRiBkZWxheSBsaW5lLgogKiBccGFyYW0gSEZtZW1vcnlTaXplICAgICAgICBTaXplIG9mIHBMRm1lbW9yeSBpbiBieXRlcy4KICoKICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogKi8KSU5UIEZES2h5YnJpZEFuYWx5c2lzT3BlbigKICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcExGbWVtb3J5LAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgIExGbWVtb3J5U2l6ZSwKICAgICAgICBGSVhQX0RCTCAqY29uc3QgICAgICAgICAgICBwSEZtZW1vcnksCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgSEZtZW1vcnlTaXplCiAgICAgICAgKTsKCgovKioKICogXGJyaWVmICBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgSHlicmRpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIGluc3RhbmNlLgogKgogKiBccGFyYW0gaEFuYWx5c2lzSHliRmlsdGVyICBBIEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIGhhbmRsZS4KICogXHBhcmFtIG1vZGUgICAgICAgICAgICAgICAgU2VsZWN0IGh5YnJpZCBmaWx0ZXIgY29uZmlndXJhdGlvbi4KICogXHBhcmFtIHFtZkJhbmRzICAgICAgICAgICAgTnVtYmVyIG9mIHFtZiBiYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAqIFxwYXJhbSBjcGx4QmFuZHMgICAgICAgICAgIE51bWJlciBvZiBjb21wbGV4IHFtZiBiYW5kcyB0byBiZSBwcm9jZXNzZWQuCiAqIFxwYXJhbSBpbml0U3RhdGVzRmxhZyAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdGF0ZXMgYnVmZmVyIGhhcyB0byBiZSBjbGVhcmVkLgogKgogKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAqLwpJTlQgRkRLaHlicmlkQW5hbHlzaXNJbml0KAogICAgICAgIEhBTkRMRV9GREtfQU5BX0hZQl9GSUxURVIgIGhBbmFseXNpc0h5YkZpbHRlciwKICAgICAgICBjb25zdCBGREtfSFlCUklEX01PREUgICAgICBtb2RlLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHFtZkJhbmRzLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIGNwbHhCYW5kcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICBpbml0U3RhdGVzRmxhZwogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgQWRqdXN0IEh5YnJkaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBzdGF0ZXMuCiAqCiAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIEEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgogKiBccGFyYW0gc2NhbGluZ1ZhbHVlICAgICAgICBTY2FsaW5nIHZhbHVlIHRvIGJlIGFwcGxpZWQgb24gZmlsdGVyIHN0YXRlcy4KICoKICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogKi8KSU5UIEZES2h5YnJpZEFuYWx5c2lzU2NhbGVTdGF0ZXMoCiAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgIHNjYWxpbmdWYWx1ZQogICAgICAgICk7CgoKLyoqCiAqIFxicmllZiAgQXBwbHkgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgb24gUW1mIGlucHV0IGRhdGEuCiAqCiAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIEEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaGFuZGxlLgogKiBccGFyYW0gcFFtZlJlYWwgICAgICAgICAgICBRbWYgaW5wdXQgZGF0YS4KICogXHBhcmFtIHBRbWZJbWFnICAgICAgICAgICAgUW1mIGlucHV0IGRhdGEuCiAqIFxwYXJhbSBwSHlicmlkUmVhbCAgICAgICAgIEh5YnJpZCBvdXRwdXQgZGF0YS4KICogXHBhcmFtIHBIeWJyaWRJbWFnICAgICAgICAgSHlicmlkIG91dHB1dCBkYXRhLgogKgogKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAqLwpJTlQgRkRLaHlicmlkQW5hbHlzaXNBcHBseSgKICAgICAgICBIQU5ETEVfRkRLX0FOQV9IWUJfRklMVEVSICBoQW5hbHlzaXNIeWJGaWx0ZXIsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZlJlYWwsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcFFtZkltYWcsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZFJlYWwsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcEh5YnJpZEltYWcKICAgICAgICApOwoKCi8qKgogKiBcYnJpZWYgIENsb3NlIGEgSHlicmlkIEFuYWx5c2lzIEZpbHRlcmJhbmsgaW5zdGFuY2UuCiAqCiAqIFxwYXJhbSBoQW5hbHlzaXNIeWJGaWx0ZXIgIFBvaW50ZXIgdG8gYSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuayBpbnN0YW5jZS4KICoKICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogKi8KSU5UIEZES2h5YnJpZEFuYWx5c2lzQ2xvc2UoCiAgICAgICAgSEFORExFX0ZES19BTkFfSFlCX0ZJTFRFUiAgaEFuYWx5c2lzSHliRmlsdGVyCiAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgIEluaXRpYWxpemUgYW5kIGNvbmZpZ3VyZSBIeWJyZGlkIFN5bnRoZXNpcyBGaWx0ZXJiYW5rIGluc3RhbmNlLgogKgogKiBccGFyYW0gaFN5bnRoZXNpc0h5YkZpbHRlciBBIEh5YnJpZCBTeW50aGVzaXMgRmlsdGVyYmFuayBoYW5kbGUuCiAqIFxwYXJhbSBtb2RlICAgICAgICAgICAgICAgIFNlbGVjdCBoeWJyaWQgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCiAqIFxwYXJhbSBxbWZCYW5kcyAgICAgICAgICAgIE51bWJlciBvZiBxbWYgYmFuZHMgdG8gYmUgcHJvY2Vzc2VkLgogKiBccGFyYW0gY3BseEJhbmRzICAgICAgICAgICBOdW1iZXIgb2YgY29tcGxleCBxbWYgYmFuZHMgdG8gYmUgcHJvY2Vzc2VkLgogKgogKiBccmV0dXJuICAwIG9uIHN1Y2Nlc3MuCiAqLwpJTlQgRkRLaHlicmlkU3ludGhlc2lzSW5pdCgKICAgICAgICBIQU5ETEVfRkRLX1NZTl9IWUJfRklMVEVSICBoU3ludGhlc2lzSHliRmlsdGVyLAogICAgICAgIGNvbnN0IEZES19IWUJSSURfTU9ERSAgICAgIG1vZGUsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgcW1mQmFuZHMsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgY3BseEJhbmRzCiAgICAgICAgKTsKCi8qKgogKiBcYnJpZWYgIEFwcGx5IEh5YnJpZCBBbmFseXNpcyBGaWx0ZXJiYW5rIG9uIEh5YnJpZCBkYXRhLgogKgogKiBccGFyYW0gaFN5bnRoZXNpc0h5YkZpbHRlciAgQSBIeWJyaWQgQW5hbHlzaXMgRmlsdGVyYmFuZGsgaGFuZGxlLgogKiBccGFyYW0gcEh5YnJpZFJlYWwgICAgICAgICAgSHlicmlkIGlucHV0IGRhdGEuCiAqIFxwYXJhbSBwSHlicmlkSW1hZyAgICAgICAgICBIeWJyaWQgaW5wdXQgZGF0YS4KICogXHBhcmFtIHBRbWZSZWFsICAgICAgICAgICAgIFFtZiBvdXRwdXQgZGF0YS4KICogXHBhcmFtIHBRbWZJbWFnICAgICAgICAgICAgIFFtZiBvdXRwdXQgZGF0YS4KICoKICogXHJldHVybiAgMCBvbiBzdWNjZXNzLgogKi8KSU5UIEZES2h5YnJpZFN5bnRoZXNpc0FwcGx5KAogICAgICAgIEhBTkRMRV9GREtfU1lOX0hZQl9GSUxURVIgIGhTeW50aGVzaXNIeWJGaWx0ZXIsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZFJlYWwsCiAgICAgICAgY29uc3QgRklYUF9EQkwgKmNvbnN0ICAgICAgcEh5YnJpZEltYWcsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZlJlYWwsCiAgICAgICAgRklYUF9EQkwgKmNvbnN0ICAgICAgICAgICAgcFFtZkltYWcKICAgICAgICApOwoKCiNlbmRpZiAvKiBfX0ZES19IWUJSSURfSCAqLwo=