LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCiogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqICBGSUxFIE5BTUUgOiBwdXRpbC5oCioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNS8xNC85OCAgICBub3MgICAgICAgICBDcmVhdGlvbiAoY29udGVudCBtb3ZlZCBoZXJlIGZyb20gdXR5cGVzLmgpLgoqICAgMDYvMTcvOTkgICAgZXJtICAgICAgICAgQWRkZWQgSUVFRV83NTQKKiAgIDA3LzIyLzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIElFRUVyZW1haW5kZXIsIG1heCwgbWluLCB0cnVuYwoqICAgMDgvMTMvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgaXNOZWdhdGl2ZUluZmluaXR5LCBpc1Bvc2l0aXZlSW5maW5pdHkKKiAgIDA4LzI0Lzk4ICAgIHN0ZXBoZW4gICAgIEFkZGVkIGxvbmdCaXRzRnJvbURvdWJsZQoqICAgMDMvMDIvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBvcGVuRmlsZSgpLiAgQWRkZWQgQVM0MDAgc3VwcG9ydC4KKiAgIDA0LzE1Lzk5ICAgIHN0ZXBoZW4gICAgIENvbnZlcnRlZCB0byBDCiogICAxMS8xNS85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIFMvMzkwIGNoYW5nZXMgZm9yIElFRUUgc3VwcG9ydC4KKiAgIDAxLzExLzAwICAgIGhlbGVuYSAgICAgIEFkZGVkIHVfZ2V0VmVyc2lvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFBVVElMX0gKI2RlZmluZSBQVVRJTF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCi8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCwKICAgdG8gMCBpZiBpdCBkb2VzIG5vdC4gKi8KI2lmbmRlZiBJRUVFXzc1NAojICAgZGVmaW5lIElFRUVfNzU0IDEKI2VuZGlmCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLyogUGxhdGZvcm0gdXRpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqCiAqIFBsYXRmb3JtIHV0aWxpdGllcyBpc29sYXRlcyB0aGUgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIG9mIHRoZQogKiBsaWJhcmFyeS4gIEZvciBlYWNoIHBsYXRmb3JtIHdoaWNoIHRoaXMgY29kZSBpcyBwb3J0ZWQgdG8sIHRoZXNlCiAqIGZ1bmN0aW9ucyBtYXkgaGF2ZSB0byBiZSByZS1pbXBsZW1lbnRlZC4KICovCgovKiBGbG9hdGluZyBwb2ludCB1dGlsaXRpZXMgCiAqLwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc05hTihkb3VibGUpOwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc0luZmluaXRlKGRvdWJsZSk7ClVfQ0FQSSBVQm9vbCAgIFVfRVhQT1JUMiB1cHJ2X2lzUG9zaXRpdmVJbmZpbml0eShkb3VibGUpOwpVX0NBUEkgVUJvb2wgICBVX0VYUE9SVDIgdXBydl9pc05lZ2F0aXZlSW5maW5pdHkoZG91YmxlKTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZ2V0TmFOKHZvaWQpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9nZXRJbmZpbml0eSh2b2lkKTsKClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3RydW5jKGRvdWJsZSBkKTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZmxvb3IoZG91YmxlIHgpOwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9jZWlsKGRvdWJsZSB4KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZmFicyhkb3VibGUgeCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X21vZGYoZG91YmxlIHgsIGRvdWJsZSogeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2Ztb2QoZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X3BvdzEwKGludDMyX3QgeCk7ClVfQ0FQSSBkb3VibGUgIFVfRVhQT1JUMiB1cHJ2X2ZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGRvdWJsZSAgVV9FWFBPUlQyIHVwcnZfZm1pbihkb3VibGUgeCwgZG91YmxlIHkpOwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXBydl9tYXgoaW50MzJfdCB4LCBpbnQzMl90IHkpOwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXBydl9taW4oaW50MzJfdCB4LCBpbnQzMl90IHkpOwoKI2lmIFVfSVNfQklHX0VORElBTgojICAgZGVmaW5lIHVwcnZfaXNOZWdhdGl2ZShudW1iZXIpICgqKChzaWduZWQgY2hhciAqKSYobnVtYmVyKSk8MCkKI2Vsc2UKIyAgIGRlZmluZSB1cHJ2X2lzTmVnYXRpdmUobnVtYmVyKSAoKigoc2lnbmVkIGNoYXIgKikmKG51bWJlcikrc2l6ZW9mKG51bWJlciktMSk8MCkKI2VuZGlmCgovKioKICogUmV0dXJuIHRoZSBsYXJnZXN0IHBvc2l0aXZlIG51bWJlciB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyCiAqIHR5cGUgb2YgYXJiaXRyYXJ5IGJpdCBsZW5ndGguCiAqLwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9tYXhNYW50aXNzYSh2b2lkKTsKCi8qKgogKiBSZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBsb2cgYmFzZSAxMCBvZiBhIGdpdmVuIGRvdWJsZS4KICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIGluYWNjdXJhY2llcyB3aGljaCBhcmlzZSBuYXR1cmFsbHkgd2hlbgogKiBjb21wdXRpbmcgbG9ncywgYW5kIGFsd2F5cyBnaXZlcyB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoZSBwYXJhbWV0ZXIKICogbXVzdCBiZSBwb3NpdGl2ZSBhbmQgZmluaXRlLgogKiAoVGhhbmtzIHRvIEFsYW4gTGl1IGZvciBzdXBwbHlpbmcgdGhpcyBmdW5jdGlvbi4pCiAqCiAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdmFsdWUgdG8gYXBwbHkgdGhlIGNvbW1vbiBsb2cgZnVuY3Rpb24gZm9yLgogKiBAcmV0dXJuIHRoZSBsb2cgb2YgdmFsdWUgZC4KICovClVfQ0FQSSBpbnQxNl90ICBVX0VYUE9SVDIgdXBydl9sb2cxMChkb3VibGUgZCk7CgpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9sb2coZG91YmxlIGQpOwoKLyoqIERvZXMgY29tbW9uIG5vdGlvbiBvZiByb3VuZGluZyBlLmcuIHVwcnZfZmxvb3IoeCArIDAuNSk7ICovCi8qIEBwYXJhbSB4IHRoZSBkb3VibGUgbnVtYmVyCiAqIEByZXR1cm4gdGhlIHJvdW5kZWQgZG91YmxlCiAqLwpVX0NBUEkgZG91YmxlICBVX0VYUE9SVDIgdXBydl9yb3VuZChkb3VibGUgeCk7CgovKioKICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIGRvdWJsZSBudW1iZXIgeC4KICoKICogQHBhcmFtIHggdGhlIGRvdWJsZSBudW1iZXIKICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBpbiBhIGRvdWJsZSBudW1iZXIgeC4KICovClVfQ0FQSSBpbnQzMl90ICBVX0VYUE9SVDIgdXBydl9kaWdpdHNBZnRlckRlY2ltYWwoZG91YmxlIHgpOwoKLyoqCiAqIFRpbWUgem9uZSB1dGlsaXRpZXMKICoKICogV3JhcHBlcnMgZm9yIEMgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucyByZWxhdGluZyB0byB0aW1lem9uZXMuCiAqIFRoZSB0X3R6c2V0KCkgZnVuY3Rpb24gKHNpbWlsYXIgdG8gdHpzZXQpIHVzZXMgdGhlIGN1cnJlbnQgc2V0dGluZyAKICogb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFRaIHRvIGFzc2lnbiB2YWx1ZXMgdG8gdGhyZWUgZ2xvYmFsIAogKiB2YXJpYWJsZXM6IGRheWxpZ2h0LCB0aW1lem9uZSwgYW5kIHR6bmFtZS4gVGhlc2UgdmFyaWFibGVzIGhhdmUgdGhlIAogKiBmb2xsb3dpbmcgbWVhbmluZ3MsIGFuZCBhcmUgZGVjbGFyZWQgaW4gJmx0O3RpbWUuaCZndDsuCiAqCiAqICAgZGF5bGlnaHQgICBOb256ZXJvIGlmIGRheWxpZ2h0LXNhdmluZy10aW1lIHpvbmUgKERTVCkgaXMgc3BlY2lmaWVkCiAqICAgICAgICAgICAgICBpbiBUWjsgb3RoZXJ3aXNlLCAwLiBEZWZhdWx0IHZhbHVlIGlzIDEuCiAqICAgdGltZXpvbmUgICBEaWZmZXJlbmNlIGluIHNlY29uZHMgYmV0d2VlbiBjb29yZGluYXRlZCB1bml2ZXJzYWwKICogICAgICAgICAgICAgIHRpbWUgYW5kIGxvY2FsIHRpbWUuIEUuZy4sIC0yOCw4MDAgZm9yIFBTVCAoR01ULThocnMpCiAqICAgdHpuYW1lKDApICBUaHJlZS1sZXR0ZXIgdGltZS16b25lIG5hbWUgZGVyaXZlZCBmcm9tIFRaIGVudmlyb25tZW50CiAqICAgICAgICAgICAgICB2YXJpYWJsZS4gRS5nLiwgIlBTVCIuCiAqICAgdHpuYW1lKDEpICBUaHJlZS1sZXR0ZXIgRFNUIHpvbmUgbmFtZSBkZXJpdmVkIGZyb20gVFogZW52aXJvbm1lbnQKICogICAgICAgICAgICAgIHZhcmlhYmxlLiAgRS5nLiwgIlBEVCIuIElmIERTVCB6b25lIGlzIG9taXR0ZWQgZnJvbSBUWiwKICogICAgICAgICAgICAgIHR6bmFtZSgxKSBpcyBhbiBlbXB0eSBzdHJpbmcuCiAqCiAqIE5vdGVzOiBGb3IgZXhhbXBsZSwgdG8gc2V0IHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjb3JyZXNwb25kCiAqIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpbiBHZXJtYW55LCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCiAqIGZvbGxvd2luZyBzdGF0ZW1lbnRzOgogKgogKiAgIHNldCBUWj1HU1QxR0RUCiAqICAgc2V0IFRaPUdTVCsxR0RUCiAqCiAqIElmIHRoZSBUWiB2YWx1ZSBpcyBub3Qgc2V0LCB0X3R6c2V0KCkgYXR0ZW1wdHMgdG8gdXNlIHRoZSB0aW1lIHpvbmUKICogaW5mb3JtYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBVbmRlciBXaW5kb3dzIE5UCiAqIGFuZCBXaW5kb3dzIDk1LCB0aGlzIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgQ29udHJvbCBQYW5lbJJzCiAqIERhdGUvVGltZSBhcHBsaWNhdGlvbi4KICogQHN0YWJsZQogKi8KVV9DQVBJIHZvaWQgICAgIFVfRVhQT1JUMiB1cHJ2X3R6c2V0KHZvaWQpOwoKLyoqCiAqIERpZmZlcmVuY2UgaW4gc2Vjb25kcyBiZXR3ZWVuIGNvb3JkaW5hdGVkIHVuaXZlcnNhbAogKiB0aW1lIGFuZCBsb2NhbCB0aW1lLiBFLmcuLCAtMjgsODAwIGZvciBQU1QgKEdNVC04aHJzKQogKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIHNlY29uZHMgYmV0d2VlbiBjb29yZGluYXRlZCB1bml2ZXJzYWwgdGltZSBhbmQgbG9jYWwgdGltZS4KICovClVfQ0FQSSBpbnQzMl90ICBVX0VYUE9SVDIgdXBydl90aW1lem9uZSh2b2lkKTsKCi8qKgogKiAgIHR6bmFtZSgwKSAgVGhyZWUtbGV0dGVyIHRpbWUtem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuIEUuZy4sICJQU1QiLgogKiAgIHR6bmFtZSgxKSAgVGhyZWUtbGV0dGVyIERTVCB6b25lIG5hbWUgZGVyaXZlZCBmcm9tIFRaIGVudmlyb25tZW50CiAqICAgICAgICAgICAgICB2YXJpYWJsZS4gIEUuZy4sICJQRFQiLiBJZiBEU1Qgem9uZSBpcyBvbWl0dGVkIGZyb20gVFosCiAqICAgICAgICAgICAgICB0em5hbWUoMSkgaXMgYW4gZW1wdHkgc3RyaW5nLgogKi8KVV9DQVBJIGNoYXIqICAgIFVfRVhQT1JUMiB1cHJ2X3R6bmFtZShpbnQgbik7CgovKioKICogR2V0IFVUQyAoR01UKSB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgc2luY2UgMDowMCBvbiAxLzEvNzAuCiAqIEByZXR1cm4gdGhlIFVUQyB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgCiAqIEBzdGFibGUKICovClVfQ0FQSSBpbnQzMl90ICBVX0VYUE9SVDIgdXBydl9nZXRVVEN0aW1lKHZvaWQpOwoKLyoqCiAqIFJldHVybiB0aGUgSUNVIGRhdGEgZGlyZWN0b3J5LiAKICogVGhlIGRhdGEgZGlyZWN0b3J5IGlzIHdoZXJlIGNvbW1vbiBmb3JtYXQgSUNVIGRhdGEgZmlsZXMgKC5kYXQgZmlsZXMpCiAqICAgYXJlIGxvYWRlZCBmcm9tLiAgTm90ZSB0aGF0IG5vcm1hbCB1c2Ugb2YgdGhlIGJ1aWx0LWluIElDVQogKiAgIGZhY2lsaXRpZXMgZG9lcyBub3QgcmVxdWlyZSBsb2FkaW5nIG9mIGFuIGV4dGVybmFsIGRhdGEgZmlsZTsKICogICB1bmxlc3MgeW91IGFyZSBhZGRpbmcgY3VzdG9tIGRhdGEgdG8gSUNVLCB0aGUgZGF0YSBkaXJlY3RvcnkKICogICBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldC4KICoKICogVGhlIGRhdGEgZGlyZWN0b3J5IGlzIGRldGVybWluZWQgYXMgZm9sbG93czoKICogICAgSWYgdV9zZXREYXRhRGlyZWN0b3J5KCkgaGFzIGJlZW4gY2FsbGVkLCB0aGF0IGlzIGl0LCBvdGhlcndpc2UKICogICAgaWYgdGhlIElDVV9EQVRBIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgdXNlIHRoYXQsIG90aGVyd2lzZQogKiAgICBPbiBXaW5kb3dzLCBpZiB0aGUgU09GVFdBUkVcSUNVXFVuaWNvZGVcRGF0YSByZWdpc3RyeSBlbnRyeSBleGlzdHMsIHVzZSB0aGF0CiAqICAgICAgICAgICAodXNlIG9mIHRoZSByZWdpc3RyeSBpbiB0aGlzIHdheSBpcyBub3QgcmVjb21tZW5kZWQuKSAgb3RoZXJ3aXNlCiAqICAgIElmIGEgZGF0YSBkaXJlY3Rvcnkgd2FzIHNwZWNpZmVkIGF0IElDVSBidWlsZCB0aW1lLCB1c2UgdGhhdAogKiAgICBvdGhlcndpc2Ugbm8gZGF0YSBkaXJlY3RvcnkgaXMgYXZhaWxhYmxlLgogKgogKiBAcmV0dXJuIHRoZSBkYXRhIGRpcmVjdG9yeSwgb3IgYW4gZW1wdHkgc3RyaW5nICgiIikgaWYgbm8gZGF0YSBkaXJlY3RvcnkgaGFzCiAqICAgICAgICAgYmVlbiBzcGVjaWZpZWQuCiAqICAgCiAqIEBzdGFibGUKICovClVfQ0FQSSBjb25zdCBjaGFyKiBVX0VYUE9SVDIgdV9nZXREYXRhRGlyZWN0b3J5KHZvaWQpOwoKLyoqIAogKiBTZXQgdGhlIElDVSBkYXRhIGRpcmVjdG9yeS4gCiAqIFRoZSBkYXRhIGRpcmVjdG9yeSBpcyB3aGVyZSBjb21tb24gZm9ybWF0IElDVSBkYXRhIGZpbGVzICguZGF0IGZpbGVzKQogKiAgIGFyZSBsb2FkZWQgZnJvbS4gIE5vdGUgdGhhdCBub3JtYWwgdXNlIG9mIHRoZSBidWlsdC1pbiBJQ1UKICogICBmYWNpbGl0aWVzIGRvZXMgbm90IHJlcXVpcmUgbG9hZGluZyBvZiBhbiBleHRlcm5hbCBkYXRhIGZpbGU7CiAqICAgdW5sZXNzIHlvdSBhcmUgYWRkaW5nIGN1c3RvbSBkYXRhIHRvIElDVSwgdGhlIGRhdGEgZGlyZWN0b3J5CiAqICAgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgaW4gYSBwcm9jZXNzLCBiZWZvcmUgdGhlCiAqIGZpcnN0IElDVSBvcGVyYXRpb24gdGhhdCB3aWxsIHJlcXVpcmUgdGhlIGxvYWRpbmcgb2YgYW4gSUNVIGRhdGEgZmlsZS4KICogQHBhcmFtIGRpc3JlY3RvcnkgVGhlIGRpcmVjdG9yeSB0byBiZSBzZXQuCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1X3NldERhdGFEaXJlY3RvcnkoY29uc3QgY2hhciAqZGlyZWN0b3J5KTsKCi8qKgogKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29kZXBhZ2UgZm9yIHRoaXMgcGxhdGZvcm0gYW5kIGxvY2FsZSAKICogQHJldHVybiB0aGUgZGVmYXVsdCBjb2RlcGFnZSBmb3IgdGhpcyBwbGF0Zm9ybSAKICogQHN0YWJsZQogKi8KVV9DQVBJIGNvbnN0IGNoYXIqICBVX0VYUE9SVDIgdXBydl9nZXREZWZhdWx0Q29kZXBhZ2Uodm9pZCk7CgovKioKICogUmV0dXJuIHRoZSBkZWZhdWx0IGxvY2FsZSBJRCBzdHJpbmcgYnkgcXVlcnlpbmcgdGhzIHN5c3RlbSwgb3IKICogICAgIHplcm8gaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4gCiAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbG9jYWxlIElEIHN0cmluZwogKiBAc3RhYmxlCiAqLwpVX0NBUEkgY29uc3QgY2hhciogIFVfRVhQT1JUMiB1cHJ2X2dldERlZmF1bHRMb2NhbGVJRCh2b2lkKTsKCi8qCiAqIEZpbmRzIHRoZSBsZWFzdCBkb3VibGUgZ3JlYXRlciB0aGFuIGQgKGlmIHBvc2l0aXZlID09IHRydWUpLAogKiBvciB0aGUgZ3JlYXRlc3QgZG91YmxlIGxlc3MgdGhhbiBkIChpZiBwb3NpdGl2ZSA9PSBmYWxzZSkuCiAqCiAqIFRoaXMgaXMgYSBzcGVjaWFsIHB1cnBvc2UgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgQ2hvaWNlRm9ybWF0IEFQSQogKiBkb2N1bWVudGF0aW9uLgogKiBJdCBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gYW5kIG5vdCBkZWZpbmVkIGZvciBOYU4gb3IgSW5maW5pdHkKICogQHJldHVybiB0aGUgbGVhc3QgZG91YmxlIGdyZWF0ZXIgdGhhbiBkIChpZiBwb3NpdGl2ZSA9PSB0cnVlKSwKICogb3IgdGhlIGdyZWF0ZXN0IGRvdWJsZSBsZXNzIHRoYW4gZCAoaWYgcG9zaXRpdmUgPT0gZmFsc2UpLgogKiBAZGVwcmVjYXRlZCBUaGlzIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciAyMDAyLUp1bi0zMC4gVXNlIHRoZSBDaG9pY2VGb3JtYXQgY2xvc3VyZXMgQVBJIGluc3RlYWQuCiAqLwpVX0NBUEkgZG91YmxlICAgICAgIFVfRVhQT1JUMiB1cHJ2X25leHREb3VibGUoZG91YmxlIGQsIFVCb29sIHBvc2l0aXZlKTsKCi8qKgogKiBGaWxlc3lzdGVtIGZpbGUgYW5kIHBhdGggc2VwYXJhdG9yIGNoYXJhY3RlcnMuCiAqIEV4YW1wbGU6ICcvJyBhbmQgJzonIG9uIFVuaXgsICdcXCcgYW5kICc7JyBvbiBXaW5kb3dzLgogKiBAc3RhYmxlCiAqLwojaWZkZWYgWFBfTUFDCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9DSEFSICc6JwojICAgZGVmaW5lIFVfUEFUSF9TRVBfQ0hBUiAnOycKIyAgIGRlZmluZSBVX0ZJTEVfU0VQX1NUUklORyAiOiIKIyAgIGRlZmluZSBVX1BBVEhfU0VQX1NUUklORyAiOyIKI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChPUzIpCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9DSEFSICdcXCcKIyAgIGRlZmluZSBVX1BBVEhfU0VQX0NIQVIgJzsnCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9TVFJJTkcgIlxcIgojICAgZGVmaW5lIFVfUEFUSF9TRVBfU1RSSU5HICI7IgojZWxzZQojICAgZGVmaW5lIFVfRklMRV9TRVBfQ0hBUiAnLycKIyAgIGRlZmluZSBVX1BBVEhfU0VQX0NIQVIgJzonCiMgICBkZWZpbmUgVV9GSUxFX1NFUF9TVFJJTkcgIi8iCiMgICBkZWZpbmUgVV9QQVRIX1NFUF9TVFJJTkcgIjoiCiNlbmRpZgoKLyoqCiAqIENvbnZlcnQgY2hhciBjaGFyYWN0ZXJzIHRvIFVDaGFyIGNoYXJhY3RlcnMuCiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgImludmFyaWFudCBjaGFyYWN0ZXJzIgogKiB0aGF0IGFyZSBlbmNvZGVkIGluIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nLgogKiBUaGV5IGFyZSBhIHNtYWxsLCBjb25zdGFudCBzdWJzZXQgb2YgdGhlIGVuY29kaW5nIGFuZCBpbmNsdWRlCiAqIGp1c3QgdGhlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgYW5kIHNvbWUgcHVuY3R1YXRpb24uCiAqIEZvciBkZXRhaWxzLCBzZWUgdXR5cGVzLmggLgogKgogKiBAcGFyYW0gY3MgSW5wdXQgc3RyaW5nLCBwb2ludHMgdG8gPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgY2hhcmFjdGVyIGJ5dGVzIGZyb20gYSBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtIGVuY29kaW5nLgogKiBAcGFyYW0gdXMgT3V0cHV0IHN0cmluZywgcG9pbnRzIHRvIG1lbW9yeSBmb3IgPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgVW5pY29kZSBjaGFyYWN0ZXJzLgogKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb252ZXJ0OyB0aGlzIG1heQogKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIDxjb2RlPk5VTDwvY29kZT4uCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMgp1X2NoYXJzVG9VQ2hhcnMoY29uc3QgY2hhciAqY3MsIFVDaGFyICp1cywgaW50MzJfdCBsZW5ndGgpOwoKLyoqCiAqIENvbnZlcnQgVUNoYXIgY2hhcmFjdGVycyB0byBjaGFyIGNoYXJhY3RlcnMuCiAqIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyB1c2VmdWwgb25seSBmb3IgImludmFyaWFudCBjaGFyYWN0ZXJzIgogKiB0aGF0IGNhbiBiZSBlbmNvZGVkIGluIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGVuY29kaW5nLgogKiBUaGV5IGFyZSBhIHNtYWxsLCBjb25zdGFudCBzdWJzZXQgb2YgdGhlIGVuY29kaW5nIGFuZCBpbmNsdWRlCiAqIGp1c3QgdGhlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgYW5kIHNvbWUgcHVuY3R1YXRpb24uCiAqIEZvciBkZXRhaWxzLCBzZWUgdXR5cGVzLmggLgogKgogKiBAcGFyYW0gdXMgSW5wdXQgc3RyaW5nLCBwb2ludHMgdG8gPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIGVuY29kZWQgd2l0aCB0aGUKICogICAgICAgICAgIGNvZGVwYWdlLWludmFyaWFudCBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtIGVuY29kaW5nLgogKiBAcGFyYW0gY3MgT3V0cHV0IHN0cmluZywgcG9pbnRzIHRvIG1lbW9yeSBmb3IgPGNvZGU+bGVuZ3RoPC9jb2RlPgogKiAgICAgICAgICAgY2hhcmFjdGVyIGJ5dGVzLgogKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBjb252ZXJ0OyB0aGlzIG1heQogKiAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIDxjb2RlPk5VTDwvY29kZT4uCiAqIEBzdGFibGUKICovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMgp1X1VDaGFyc1RvQ2hhcnMoY29uc3QgVUNoYXIgKnVzLCBjaGFyICpjcywgaW50MzJfdCBsZW5ndGgpOwoKLyogRGVmaW5lIFVfVVBQRVJfT1JESU5BTCAqLwojaWYgVV9DSEFSU0VUX0ZBTUlMWT09VV9BU0NJSV9GQU1JTFkKIyAgIGRlZmluZSBVX1VQUEVSX09SRElOQUwoeCkgKCh4KS0nQScpCiNlbGlmIFVfQ0hBUlNFVF9GQU1JTFk9PVVfRUJDRElDX0ZBTUlMWQojICAgZGVmaW5lIFVfVVBQRVJfT1JESU5BTCh4KSAoKCh4KSA8ICdKJykgPyAoKHgpLSdBJykgOiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpIDwgJ1MnKSA/ICgoeCktJ0onKzkpIDogXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KS0nUycrMTgpKSkKI2Vsc2UKIyAgIGVycm9yIFVua25vd24gY2hhcnNldCBmYW1pbHkhCiNlbmRpZgoKLyoqCiAqIE1heGltdW0gdmFsdWUgb2YgYSAodm9pZCopIC0gdXNlIHRvIGluZGljYXRlIHRoZSBsaW1pdCBvZiBhbiAnaW5maW5pdGUnIGJ1ZmZlci4KICogSW4gZmFjdCwgYnVmZmVyIHNpemVzIG11c3Qgbm90IGV4Y2VlZCAyR0Igc28gdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCiAqIHRoZSBidWZmZXIgbGltaXQgYW5kIHRoZSBidWZmZXIgc3RhcnQgY2FuIGJlIGV4cHJlc3NlZCBpbiBhbiBpbnQzMl90LgogKgogKiBUaGUgZGVmaW5pdGlvbiBvZiBVX01BWF9QVFIgbXVzdCBmdWxmaWxsIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogLSByZXR1cm4gdGhlIGxhcmdlc3QgcG9zc2libGUgcG9pbnRlciBncmVhdGVyIHRoYW4gYmFzZQogKiAtIHJldHVybiBhIHZhbGlkIHBvaW50ZXIgYWNjb3JkaW5nIHRvIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSAoQVMvNDAwLCA2NC1iaXQsIGV0Yy4pCiAqIC0gYXZvaWQgd3JhcHBpbmcgYXJvdW5kIGF0IGhpZ2ggYWRkcmVzc2VzCiAqIC0gbWFrZSBzdXJlIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgbm90IGZhcnRoZXIgZnJvbSBiYXNlIHRoYW4gMHg3ZmZmZmZmZgogKgogKiBAcGFyYW0gYmFzZSBUaGUgYmVnaW5uaW5nIG9mIGEgYnVmZmVyIHRvIGZpbmQgdGhlIG1heGltdW0gb2Zmc2V0IGZyb20KICogQGludGVybmFsCiAqLwojaWZuZGVmIFVfTUFYX1BUUgojICBpZmRlZiBPUzM5MAojICAgIGRlZmluZSBVX01BWF9QVFIoYmFzZSkgKCh2b2lkICopMHg3ZmZmZmZmZikKIyAgZWxpZiBkZWZpbmVkKE9TNDAwKQovKgogKiBXaXRoIHRoZSBwcm92aWRlZCBtYWNybyB3ZSBzaG91bGQgbmV2ZXIgYmUgb3V0IG9mIHJhbmdlIG9mIGEgZ2l2ZW4gc2VnbWVudAogKiAoYSB0cmFkaXRpb25hbC90eXBpY2FsIHNlZ21lbnQgdGhhdCBpcykuICBPdXIgc2VnbWVudHMgaGF2ZSA1IGJ5dGVzIGZvciB0aGUgaWQKICogYW5kIDMgYnl0ZXMgZm9yIHRoZSBvZmZzZXQuICBUaGUga2V5IGlzIHRoYXQgdGhlIGNhc3RpbmcgdGFrZXMgY2FyZSBvZiBvbmx5CiAqIHJldHJpZXZpbmcgdGhlIG9mZnNldCBwb3J0aW9uIG1pbnVzIHgxMDAwLiAgSGVuY2UsIHRoZSBzbWFsbGVzdCBvZmZzZXQgc2VlbiBpbgogKiBhIHByb2dyYW0gaXMgeDAwMTAwMCBhbmQgd2hlbiBjYXN0ZWQgdG8gYW4gaW50IHdvdWxkIGJlIDAuICBUaGF0J3Mgd2h5IHdlIGNhbgogKiBvbmx5IGFkZCAweGZmZWZmZi4gIE90aGVyd2lzZSwgd2Ugd291bGQgZXhjZWVkIHRoZSBzZWdtZW50LgogKgogKiBDdXJyZW50bHksIDE2TUIgaXMgdGhlIGN1cnJlbnQgYWRkcmVzc2luZyBsaW1pdGF0aW9uIG9uIGFzLzQwMC4gIFRoaXMgbWFjcm8KICogbWF5IGV2ZW50dWFsbHkgYmUgY2hhbmdlZCB0byB1c2UgMkdCIGFkZHJlc3NhYmlsaXR5IGZvciB0aGUgbmV3ZXIgdmVyc2lvbiBvZgogKiBhcy80MDAgbWFjaGluZXMuCiAqLwojICAgIGRlZmluZSBVX01BWF9QVFIoYmFzZSkgKCh2b2lkICopKCgoY2hhciAqKWJhc2UpLSgoaW50MzJfdCkoYmFzZSkpKygoaW50MzJfdCkweGZmZWZmZikpKQojICBlbHNlCiMgICAgZGVmaW5lIFVfTUFYX1BUUihiYXNlKSAoKHZvaWQgKikoKChjaGFyICopKGJhc2UpKzB4N2ZmZmZmZmYpID4gKGNoYXIgKikoYmFzZSkgPyAoKGNoYXIgKikoYmFzZSkrMHg3ZmZmZmZmZikgOiAoY2hhciAqKS0xKSkKIyAgZW5kaWYKI2VuZGlmCgojZW5kaWYK