LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogQ09QWVJJR0hUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAgMTk5Ny0xOTk5ICAgICAqCiogICBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb2dyYW0tUHJvcGVydHkgb2YgSUJNIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgKgoqICAgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogIEZJTEUgTkFNRSA6IHB1dGlsLmgKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA1LzE0Lzk4ICAgIG5vcyAgICAgICAgIENyZWF0aW9uIChjb250ZW50IG1vdmVkIGhlcmUgZnJvbSB1dHlwZXMuaCkuCiogICAwNi8xNy85OSAgICBlcm0gICAgICAgICBBZGRlZCBJRUVFXzc1NAoqICAgMDcvMjIvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgSUVFRXJlbWFpbmRlciwgbWF4LCBtaW4sIHRydW5jCiogICAwOC8xMy85OCAgICBzdGVwaGVuICAgICBBZGRlZCBpc05lZ2F0aXZlSW5maW5pdHksIGlzUG9zaXRpdmVJbmZpbml0eQoqICAgMDgvMjQvOTggICAgc3RlcGhlbiAgICAgQWRkZWQgbG9uZ0JpdHNGcm9tRG91YmxlCiogICAwMy8wMi85OSAgICBzdGVwaGVuICAgICBSZW1vdmVkIG9wZW5GaWxlKCkuICBBZGRlZCBBUzQwMCBzdXBwb3J0LgoqICAgMDQvMTUvOTkgICAgc3RlcGhlbiAgICAgQ29udmVydGVkIHRvIEMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBQVVRJTF9ICiNkZWZpbmUgUFVUSUxfSAoKI2luY2x1ZGUgInV0eXBlcy5oIgoKLyogRGVmaW5lIHRoaXMgaWYgeW91ciBwbGF0Zm9ybSBzdXBwb3J0cyBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCAqLwojZGVmaW5lIElFRUVfNzU0ICAgICAgIAoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwovKiBQbGF0Zm9ybSB1dGlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKgogKiBQbGF0Zm9ybSB1dGlsaXRpZXMgaXNvbGF0ZXMgdGhlIHBsYXRmb3JtIGRlcGVuZGVuY2llcyBvZiB0aGUKICogbGliYXJhcnkuICBGb3IgZWFjaCBwbGF0Zm9ybSB3aGljaCB0aGlzIGNvZGUgaXMgcG9ydGVkIHRvLCB0aGVzZQogKiBmdW5jdGlvbnMgbWF5IGhhdmUgdG8gYmUgcmUtaW1wbGVtZW50ZWQuICAqLwoKLyogRmxvYXRpbmcgcG9pbnQgdXRpbGl0aWVzICovClVfQ0FQSSBib29sX3QgIFVfRVhQT1JUMiAgaWN1X2lzTmFOKGRvdWJsZSk7ClVfQ0FQSSBib29sX3QgIFVfRVhQT1JUMiBpY3VfaXNJbmZpbml0ZShkb3VibGUpOwpVX0NBUEkgYm9vbF90ICAgVV9FWFBPUlQyIGljdV9pc1Bvc2l0aXZlSW5maW5pdHkoZG91YmxlKTsKVV9DQVBJIGJvb2xfdCAgIFVfRVhQT1JUMiBpY3VfaXNOZWdhdGl2ZUluZmluaXR5KGRvdWJsZSk7ClVfQ0FQSSBkb3VibGUgICBVX0VYUE9SVDIgaWN1X2dldE5hTih2b2lkKTsKVV9DQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZ2V0SW5maW5pdHkodm9pZCk7CgpVX0NBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9mbG9vcihkb3VibGUgeCk7ClVfQ0FQSSBkb3VibGUgICBVX0VYUE9SVDIgaWN1X2NlaWwoZG91YmxlIHgpOwpVX0NBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9mYWJzKGRvdWJsZSB4KTsKVV9DQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfbW9kZihkb3VibGUgeCwgZG91YmxlKiB5KTsKVV9DQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZm1vZChkb3VibGUgeCwgZG91YmxlIHkpOwpVX0NBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9wb3cxMChpbnQzMl90IHgpOwpVX0NBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV9JRUVFcmVtYWluZGVyKGRvdWJsZSB4LCBkb3VibGUgeSk7ClVfQ0FQSSBkb3VibGUgICBVX0VYUE9SVDIgaWN1X2ZtYXgoZG91YmxlIHgsIGRvdWJsZSB5KTsKVV9DQVBJIGRvdWJsZSAgIFVfRVhQT1JUMiBpY3VfZm1pbihkb3VibGUgeCwgZG91YmxlIHkpOwpVX0NBUEkgaW50MzJfdCAgVV9FWFBPUlQyIGljdV9tYXgoaW50MzJfdCB4LCBpbnQzMl90IHkpOwpVX0NBUEkgaW50MzJfdCAgVV9FWFBPUlQyIGljdV9taW4oaW50MzJfdCB4LCBpbnQzMl90IHkpOwpVX0NBUEkgZG91YmxlICAgVV9FWFBPUlQyIGljdV90cnVuYyhkb3VibGUgZCk7ClVfQ0FQSSB2b2lkICAgICBVX0VYUE9SVDIgaWN1X2xvbmdCaXRzRnJvbURvdWJsZShkb3VibGUgZCwgaW50MzJfdCAqaGksIHVpbnQzMl90ICpsbyk7CgovKgogKiBSZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBsb2cgYmFzZSAxMCBvZiBhIGdpdmVuIGRvdWJsZS4KICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIGluYWNjdXJhY2llcyB3aGljaCBhcmlzZSBuYXR1cmFsbHkgd2hlbgogKiBjb21wdXRpbmcgbG9ncywgYW5kIGFsd2F5cyBnaXZlcyB0aGUgY29ycmVjdCB2YWx1ZS4gIFRoZSBwYXJhbWV0ZXIKICogbXVzdCBiZSBwb3NpdGl2ZSBhbmQgZmluaXRlLgogKiAoVGhhbmtzIHRvIEFsYW4gTGl1IGZvciBzdXBwbHlpbmcgdGhpcyBmdW5jdGlvbi4pCiAqLwovKioKICogUmV0dXJucyB0aGUgY29tbW9uIGxvZyBvZiB0aGUgZG91YmxlIHZhbHVlIGQuCiAqIEBwYXJhbSBkIHRoZSBkb3VibGUgdmFsdWUgdG8gYXBwbHkgdGhlIGNvbW1vbiBsb2cgZnVuY3Rpb24gZm9yLgogKiBAcmV0dXJuIHRoZSBsb2cgb2YgdmFsdWUgZC4KICovClVfQ0FQSSBpbnQxNl90ICBVX0VYUE9SVDIgaWN1X2xvZzEwKGRvdWJsZSBkKTsKCi8qKgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGluIGEgZG91YmxlIG51bWJlciB4LgogKiBAcGFyYW0geCB0aGUgZG91YmxlIG51bWJlcgogKi8KVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiBpY3VfZGlnaXRzQWZ0ZXJEZWNpbWFsKGRvdWJsZSB4KTsKCi8qKgogKiBUaW1lIHpvbmUgdXRpbGl0aWVzCiAqCiAqIFdyYXBwZXJzIGZvciBDIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMgcmVsYXRpbmcgdG8gdGltZXpvbmVzLgogKiBUaGUgdF90enNldCgpIGZ1bmN0aW9uIChzaW1pbGFyIHRvIHR6c2V0KSB1c2VzIHRoZSBjdXJyZW50IHNldHRpbmcgCiAqIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBUWiB0byBhc3NpZ24gdmFsdWVzIHRvIHRocmVlIGdsb2JhbCAKICogdmFyaWFibGVzOiBkYXlsaWdodCwgdGltZXpvbmUsIGFuZCB0em5hbWUuIFRoZXNlIHZhcmlhYmxlcyBoYXZlIHRoZSAKICogZm9sbG93aW5nIG1lYW5pbmdzLCBhbmQgYXJlIGRlY2xhcmVkIGluICZsdDt0aW1lLmg+LgogKgogKiAgIGRheWxpZ2h0ICAgTm9uemVybyBpZiBkYXlsaWdodC1zYXZpbmctdGltZSB6b25lIChEU1QpIGlzIHNwZWNpZmllZAogKiAgICAgICAgICAgICAgaW4gVFo7IG90aGVyd2lzZSwgMC4gRGVmYXVsdCB2YWx1ZSBpcyAxLgogKiAgIHRpbWV6b25lICAgRGlmZmVyZW5jZSBpbiBzZWNvbmRzIGJldHdlZW4gY29vcmRpbmF0ZWQgdW5pdmVyc2FsCiAqICAgICAgICAgICAgICB0aW1lIGFuZCBsb2NhbCB0aW1lLiBFLmcuLCAtMjgsODAwIGZvciBQU1QgKEdNVC04aHJzKQogKiAgIHR6bmFtZSgwKSAgVGhyZWUtbGV0dGVyIHRpbWUtem9uZSBuYW1lIGRlcml2ZWQgZnJvbSBUWiBlbnZpcm9ubWVudAogKiAgICAgICAgICAgICAgdmFyaWFibGUuIEUuZy4sICJQU1QiLgogKiAgIHR6bmFtZSgxKSAgVGhyZWUtbGV0dGVyIERTVCB6b25lIG5hbWUgZGVyaXZlZCBmcm9tIFRaIGVudmlyb25tZW50CiAqICAgICAgICAgICAgICB2YXJpYWJsZS4gIEUuZy4sICJQRFQiLiBJZiBEU1Qgem9uZSBpcyBvbWl0dGVkIGZyb20gVFosCiAqICAgICAgICAgICAgICB0em5hbWUoMSkgaXMgYW4gZW1wdHkgc3RyaW5nLgogKgogKiBOb3RlczogRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29ycmVzcG9uZAogKiB0byB0aGUgY3VycmVudCB0aW1lIHpvbmUgaW4gR2VybWFueSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZQogKiBmb2xsb3dpbmcgc3RhdGVtZW50czoKICoKICogICBzZXQgVFo9R1NUMUdEVAogKiAgIHNldCBUWj1HU1QrMUdEVAogKgogKiBJZiB0aGUgVFogdmFsdWUgaXMgbm90IHNldCwgdF90enNldCgpIGF0dGVtcHRzIHRvIHVzZSB0aGUgdGltZSB6b25lCiAqIGluZm9ybWF0aW9uIHNwZWNpZmllZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gVW5kZXIgV2luZG93cyBOVAogKiBhbmQgV2luZG93cyA5NSwgdGhpcyBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIENvbnRyb2wgUGFuZWyScwogKiBEYXRlL1RpbWUgYXBwbGljYXRpb24uCiAqLwpVX0NBUEkgdm9pZCAgICAgVV9FWFBPUlQyIGljdV90enNldCh2b2lkKTsKVV9DQVBJIGludDMyX3QgIFVfRVhQT1JUMiBpY3VfdGltZXpvbmUodm9pZCk7ClVfQ0FQSSBjaGFyKiAgICBVX0VYUE9SVDIgaWN1X3R6bmFtZShpbnQgaW5kZXgpOwoKLyogR2V0IFVUQyAoR01UKSB0aW1lIG1lYXN1cmVkIGluIHNlY29uZHMgc2luY2UgMDowMCBvbiAxLzEvNzAuICovClVfQ0FQSSBpbnQzMl90ICBVX0VYUE9SVDIgaWN1X2dldFVUQ3RpbWUodm9pZCk7CgovKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGF0YSBkaXJlY3RvcnkgZm9yIHRoaXMgcGxhdGZvcm0uICBTZWUgTG9jYWxlLiAqLwpVX0NBUEkgY29uc3QgY2hhciogIFVfRVhQT1JUMiBpY3VfZ2V0RGVmYXVsdERhdGFEaXJlY3Rvcnkodm9pZCk7CgovKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29kZXBhZ2UgZm9yIHRoaXMgcGxhdGZvcm0gYW5kIGxvY2FsZSAqLwpVX0NBUEkgY29uc3QgY2hhciogIFVfRVhQT1JUMiBpY3VfZ2V0RGVmYXVsdENvZGVwYWdlKHZvaWQpOwoKLyogUmV0dXJuIHRoZSBkZWZhdWx0IGxvY2FsZSBJRCBzdHJpbmcgYnkgcXVlcnlpbmcgdGhzIHN5c3RlbSwgb3IKICAgICAgIHplcm8gaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4gKi8KVV9DQVBJIGNvbnN0IGNoYXIqICBVX0VYUE9SVDIgaWN1X2dldERlZmF1bHRMb2NhbGVJRCh2b2lkKTsKCi8qCiAqIEZpbmRzIHRoZSBsZWFzdCBkb3VibGUgZ3JlYXRlciB0aGFuIGQgKGlmIHBvc2l0aXZlID09IHRydWUpLAogKiBvciB0aGUgZ3JlYXRlc3QgZG91YmxlIGxlc3MgdGhhbiBkIChpZiBwb3NpdGl2ZSA9PSBmYWxzZSkuCiAqCiAqIFRoaXMgaXMgYSBzcGVjaWFsIHB1cnBvc2UgZnVuY3Rpb24gZGVmaW5lZCBieSB0aGUgQ2hvaWNlRm9ybWF0IEFQSQogKiBkb2N1bWVudGF0aW9uLgogKiBJdCBpcyBub3QgYSBnZW5lcmFsIHB1cnBvc2UgZnVuY3Rpb24gYW5kIG5vdCBkZWZpbmVkIGZvciBOYU4gb3IgSW5maW5pdHkKICovClVfQ0FQSSBkb3VibGUgICAgICAgICAgIFVfRVhQT1JUMiBpY3VfbmV4dERvdWJsZShkb3VibGUgZCwgYm9vbF90IHBvc2l0aXZlKTsKCiNlbmRpZgoKCgoK