LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3dkZy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDAzLzEwLzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgV0RHIHNvZnR3YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA3LzE3LzIwMDYgOiBWMS4wDQoqIDAzLzEwLzIwMDYgOiBWMC4xDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI3NXhfd2RnLmgiDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBSZWdpc3RlcnMgcmVzZXQgdmFsdWUgKi8NCiNkZWZpbmUgV0RHX1ByZWxvYWRfTWFzayAgICAgMHhGRkZGDQojZGVmaW5lIFdER19QcmVzY2FsZXJfTWFzayAgIDB4RkYNCg0KLyogV0RHIFN0YXJ0L1N0b3AgY291bnRlciAqLw0KI2RlZmluZSBXREdfQ291bnRlcl9TdGFydF9NYXNrICAweDAwMDINCiNkZWZpbmUgV0RHX0NvdW50ZXJfU3RvcF9NYXNrICAgMHhGRkZEDQoNCi8qIFdERyBTZXF1ZW5jZSAqLw0KI2RlZmluZSBXREdfS2V5VmFsdWUxX01hc2sgICAgICAweEE1NUENCiNkZWZpbmUgV0RHX0tleVZhbHVlMl9NYXNrICAgICAgMHg1QUE1DQoNCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogV0RHX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFdERyBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFdER19EZUluaXQodm9pZCkNCnsNCiAgLyogUmVzZXQgYWxsIHRoZSBXREcgcmVnaXN0ZXJzICovDQogIFdERy0+Q1IgPSAweDAwMDA7DQogIFdERy0+UFIgPSAweDAwRkY7DQogIFdERy0+VlIgPSAweEZGRkY7DQogIFdERy0+Q05UID0gMHhGRkZGOw0KICBXREctPlNSID0gMHgwMDAwOw0KICBXREctPk1SID0gMHgwMDAwOw0KICBXREctPktSID0gMHgwMDAwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFdER19Jbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgV0RHICBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgV0RHX0luaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogV0RHX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBXREdfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIFdERyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBXREdfSW5pdChXREdfSW5pdFR5cGVEZWYqIFdER19Jbml0U3RydWN0KQ0Kew0KICAvKiBDb25maWd1cmUgV0RHIFByZXNjYWxlciByZWdpc3RlciB2YWx1ZSAqLw0KICBXREctPlBSID0gV0RHX0luaXRTdHJ1Y3QtPldER19QcmVzY2FsZXI7DQoNCiAgLyogQ29uZmlndXJlIFdERyBQcmUtbG9hZCByZWdpc3RlciB2YWx1ZSAqLw0KICBXREctPlZSID0gV0RHX0luaXRTdHJ1Y3QtPldER19QcmVsb2FkIDsNCiAgDQogIGlmKFdER19Jbml0U3RydWN0LT5XREdfTW9kZSA9PSBXREdfTW9kZV9XREcpDQogIHsNCiAgICAvKiBTZWxlY3QgV0RHIG1vZGUgKi8NCiAgICBXREctPkNSIHw9IFdER19Nb2RlX1dERyA7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogU2VsZWN0IFRpbWVyIG1vZGUgKi8NCiAgICBXREctPkNSICY9IFdER19Nb2RlX1RpbWVyOyAgICANCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFdER19TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBXREdfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBXREdfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBXREdfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgV0RHX1N0cnVjdEluaXQoV0RHX0luaXRUeXBlRGVmICpXREdfSW5pdFN0cnVjdCkNCnsNCiAgLyogSW5pdGlhbGl6ZSBtb2RlICovDQogIFdER19Jbml0U3RydWN0LT5XREdfTW9kZSA9IFdER19Nb2RlX1RpbWVyOw0KDQogIC8qIEluaXRpYWxpemUgUHJlbG9hZCAqLw0KICBXREdfSW5pdFN0cnVjdC0+V0RHX1ByZWxvYWQgPSBXREdfUHJlbG9hZF9NYXNrIDsNCg0KICAvKiBJbml0aWFsaXplIFByZXNjYWxlciAqLw0KICBXREdfSW5pdFN0cnVjdC0+V0RHX1ByZXNjYWxlciA9IFdER19QcmVzY2FsZXJfTWFzazsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBXREdfQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgV0RHIHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgV0RHIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFdER19DbWQoRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBpZigoV0RHLT5DUiAmIFdER19Nb2RlX1dERykgPT0gMCkNCiAgew0KICAgIC8qIFRpbWVyIG1vZGUgKi8NCiAgICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgLyogU3RhcnQgdGltZXIgYnkgc2V0dGluZyBTQyBiaXQgaW4gQ29udHJvbCByZWdpc3RlciAqLw0KICAgICAgV0RHLT5DUiB8PSBXREdfQ291bnRlcl9TdGFydF9NYXNrOw0KICAgIH0NCiAgICBlbHNlIA0KICAgIHsNCiAgICAgIC8qIFN0b3AgdGltZXIgYnkgY2xlYXJpbmcgU0MgYml0IGluIENvbnRyb2wgcmVnaXN0ZXIgKi8NCiAgICAgIFdERy0+Q1IgJj0gV0RHX0NvdW50ZXJfU3RvcF9NYXNrOw0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBXYXRjaGRvZyBtb2RlICovDQogICAgaWYoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIFdERy0+S1IgPSBXREdfS2V5VmFsdWUxX01hc2s7DQogICAgICBXREctPktSID0gV0RHX0tleVZhbHVlMl9NYXNrOw0KICAgIH0NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFdER19JVENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFdERyBFbmQgb2YgQ291bnQoRUMpIGludGVycnVwdC4NCiogSW5wdXQgICAgICAgICAgOiBOZXdzdGF0ZTogIG5ldyBzdGF0ZSBvZiB0aGUgV0RHIEVuZCBvZiBDb3VudChFQykgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFdER19JVENvbmZpZyhGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgRW5kIG9mIENvdW50IGludGVycnVwdCAqLw0KICAgIFdERy0+TVIgfD0gV0RHX0lUX0VDOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIEVuZCBvZiBDb3VudCBpbnRlcnJ1cHQgKi8NCiAgICBXREctPk1SICY9IH5XREdfSVRfRUM7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBXREdfR2V0Q291bnRlcg0KKiBEZXNjcmlwdGlvbiAgICA6IEdldHMgdGhlIFdER5JzIGN1cnJlbnQgY291bnRlciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBXREcgY3VycmVudCBjb3VudGVyIHZhbHVlDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFdER19HZXRDb3VudGVyKHZvaWQpDQp7DQogICByZXR1cm4gV0RHLT5DTlQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogV0RHX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgV0RHIEVuZCBvZiBDb3VudChFQykgZmxhZyBpcyBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBXREcgRW5kIG9mIENvdW50KEVDKSBmbGFnIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgV0RHX0dldEZsYWdTdGF0dXModm9pZCkNCnsNCiAgaWYoKFdERy0+U1IgJiBXREdfRkxBR19FQykgIT0gUkVTRVQgKQ0KICB7DQogICAgcmV0dXJuIFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICByZXR1cm4gUkVTRVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBXREdfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBXREeScyBFbmQgb2YgQ291bnQoRUMpIHBlbmRpbmcgZmxhZy4gDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBXREdfQ2xlYXJGbGFnKHZvaWQpDQp7DQogIC8qIENsZWFyIHRoZSBFQyBwZW5kaW5nIGJpdCAqLw0KICBXREctPlNSICY9IH5XREdfRkxBR19FQzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBXREdfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgV0RHIEVuZCBvZiBDb3VudChFQykgaW50ZXJydXB0IGhhcyANCiogICAgICAgICAgICAgICAgICBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFdERyBFbmQgb2YgQ291bnQoRUMpIGludGVycnVwdCAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBXREdfR2V0SVRTdGF0dXModm9pZCkNCnsNCiAgaWYoKChXREctPlNSICYgV0RHX0lUX0VDKSAhPSBSRVNFVCApJiYoKFdERy0+TVIgJiBXREdfSVRfRUMpICE9IFJFU0VUICkpDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFdER19DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgV0RHJ3MgRW5kIG9mIENvdW50KEVDKSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBXREdfQ2xlYXJJVFBlbmRpbmdCaXQodm9pZCkNCnsNCiAvKiBDbGVhciB0aGUgRUMgcGVuZGluZyBiaXQgKi8NCiAgV0RHLT5TUiAmPSB+V0RHX0lUX0VDOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDYgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K