LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X252aWMuYw0KKiBBdXRob3IgICAgICAgICAgICAgOiBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKiBEYXRlIEZpcnN0IElzc3VlZCAgOiAwOS8yOS8yMDA2DQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIE5WSUMgZmlybXdhcmUgZnVuY3Rpb25zLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogSGlzdG9yeToNCiogMDQvMDIvMjAwNzogVjAuMg0KKiAwMi8wNS8yMDA3OiBWMC4xDQoqIDA5LzI5LzIwMDY6IFYwLjAxDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfbnZpYy5oIg0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNkZWZpbmUgQUlSQ19WRUNUS0VZX01BU0sgICAgKCh1MzIpMHgwNUZBMDAwMCkNCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIE5WSUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfRGVJbml0KHZvaWQpDQp7DQogIHUzMiBpbmRleCA9IDA7DQogIA0KICBOVklDLT5EaXNhYmxlWzBdID0gMHhGRkZGRkZGRjsNCiAgTlZJQy0+RGlzYWJsZVsxXSA9IDB4MDAwMDA3RkY7DQogIE5WSUMtPkNsZWFyWzBdID0gMHhGRkZGRkZGRjsNCiAgTlZJQy0+Q2xlYXJbMV0gPSAweDAwMDAwN0ZGOw0KICANCiAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCAweDBCOyBpbmRleCsrKQ0KICB7DQogICAgIE5WSUMtPlByaW9yaXR5W2luZGV4XSA9IDB4MDAwMDAwMDA7DQogIH0gDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TQ0JEZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBTQ0IgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCANCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1NDQkRlSW5pdCh2b2lkKQ0Kew0KICB1MzIgaW5kZXggPSAweDAwOw0KICANCiAgU0NCLT5JUlFDb250cm9sU3RhdGUgPSAweDBBMDAwMDAwOw0KICBTQ0ItPkV4Y2VwdGlvblRhYmxlT2Zmc2V0ID0gMHgwMDAwMDAwMDsNCiAgU0NCLT5BSVJDID0gQUlSQ19WRUNUS0VZX01BU0s7DQogIFNDQi0+U3lzQ3RybCA9IDB4MDAwMDAwMDA7DQogIFNDQi0+Q29uZmlnQ3RybCA9IDB4MDAwMDAwMDA7DQogIGZvcihpbmRleCA9IDA7IGluZGV4IDwgMHgwMzsgaW5kZXgrKykNCiAgew0KICAgICBTQ0ItPlN5c3RlbVByaW9yaXR5W2luZGV4XSA9IDA7DQogIH0NCiAgU0NCLT5TeXNIYW5kbGVyQ3RybCA9IDB4MDAwMDAwMDA7DQogIFNDQi0+Q29uZmlnRmF1bHRTdGF0dXMgPSAweEZGRkZGRkZGOw0KICBTQ0ItPkhhcmRGYXVsdFN0YXR1cyA9IDB4RkZGRkZGRkY7DQogIFNDQi0+RGVidWdGYXVsdFN0YXR1cyA9IDB4RkZGRkZGRkY7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19Qcmlvcml0eUdyb3VwQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgcHJpb3JpdHkgZ3JvdXBpbmc6IHByZS1lbXB0aW9uIHByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgYW5kIHN1YnByaW9yaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gTlZJQ19Qcmlvcml0eUdyb3VwOiBzcGVjaWZpZXMgdGhlIHByaW9yaXR5IGdyb3VwaW5nIGJpdHMNCiogICAgICAgICAgICAgICAgICAgIGxlbmd0aC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19Qcmlvcml0eUdyb3VwXzA6IDAgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgICAgNCBiaXRzIGZvciBzdWJwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBOVklDX1ByaW9yaXR5R3JvdXBfMTogMSBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAzIGJpdHMgZm9yIHN1YnByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfUHJpb3JpdHlHcm91cF8yOiAyIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAgIDIgYml0cyBmb3Igc3VicHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19Qcmlvcml0eUdyb3VwXzM6IDMgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgICAgMSBiaXRzIGZvciBzdWJwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBOVklDX1ByaW9yaXR5R3JvdXBfNDogNCBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAwIGJpdHMgZm9yIHN1YnByaW9yaXR5DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfUHJpb3JpdHlHcm91cENvbmZpZyh1MzIgTlZJQ19Qcmlvcml0eUdyb3VwKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfTlZJQ19QUklPUklUWV9HUk9VUChOVklDX1ByaW9yaXR5R3JvdXApKTsNCiAgDQogIC8qIFNldCB0aGUgUFJJR1JPVVBbMTA6OF0gYml0cyBhY2NvcmRpbmcgdG8gTlZJQ19Qcmlvcml0eUdyb3VwIHZhbHVlICovDQogIFNDQi0+QUlSQyA9IEFJUkNfVkVDVEtFWV9NQVNLIHwgTlZJQ19Qcmlvcml0eUdyb3VwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBOVklDIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBOVklDX0luaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBOVklDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlDQoqICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgTlZJQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0luaXQoTlZJQ19Jbml0VHlwZURlZiogTlZJQ19Jbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wcHJpb3JpdHkgPSAweDAwLCB0bXByZWcgPSAweDAwLCB0bXBtYXNrID0gMHgwMDsNCiAgdTMyIHRtcHByZSA9IDAsIHRtcHN1YiA9IDB4MEY7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWxDbWQpKTsNCiAgYXNzZXJ0KElTX05WSUNfSVJRX0NIQU5ORUwoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwpKTsNCiAgYXNzZXJ0KElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFByZWVtcHRpb25Qcmlvcml0eSkpOyAgDQogIGFzc2VydChJU19OVklDX1NVQl9QUklPUklUWShOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFN1YlByaW9yaXR5KSk7DQogICAgDQogIGlmIChOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbENtZCAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogQ29tcHV0ZSB0aGUgQ29ycmVzcG9uZGluZyBJUlEgUHJpb3JpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCiAgICB0bXBwcmlvcml0eSA9ICgweDcwMCAtIChTQ0ItPkFJUkMgJiAodTMyKTB4NzAwKSk+PiAweDA4Ow0KICAgIHRtcHByZSA9ICgweDQgLSB0bXBwcmlvcml0eSk7DQogICAgdG1wc3ViID0gdG1wc3ViID4+IHRtcHByaW9yaXR5Ow0KICAgIA0KICAgIHRtcHByaW9yaXR5ID0gKHUzMilOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFByZWVtcHRpb25Qcmlvcml0eSA8PCB0bXBwcmU7DQogICAgdG1wcHJpb3JpdHkgfD0gIE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsU3ViUHJpb3JpdHkgJiB0bXBzdWI7DQoNCiAgICB0bXBwcmlvcml0eSA9IHRtcHByaW9yaXR5IDw8IDB4MDQ7DQogICAgdG1wcHJpb3JpdHkgPSAoKHUzMil0bXBwcmlvcml0eSkgPDwgKChOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCAmICh1OCkweDAzKSAqIDB4MDgpOw0KICAgIA0KICAgIHRtcHJlZyA9IE5WSUMtPlByaW9yaXR5WyhOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCA+PiAweDAyKV07DQogICAgdG1wbWFzayA9ICh1MzIpMHhGRiA8PCAoKE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsICYgKHU4KTB4MDMpICogMHgwOCk7DQogICAgdG1wcmVnICY9IH50bXBtYXNrOw0KICAgIHRtcHByaW9yaXR5ICY9IHRtcG1hc2s7ICANCiAgICB0bXByZWcgfD0gdG1wcHJpb3JpdHk7DQoNCiAgICBOVklDLT5Qcmlvcml0eVsoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgPj4gMHgwMildID0gdG1wcmVnOw0KICAgIA0KICAgIC8qIEVuYWJsZSB0aGUgU2VsZWN0ZWQgSVJRIENoYW5uZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBOVklDLT5FbmFibGVbKE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsID4+IDB4MDUpXSA9DQogICAgICAodTMyKTB4MDEgPDwgKE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsICYgKHU4KTB4MUYpOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNlbGVjdGVkIElSUSBDaGFubmVscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBOVklDLT5EaXNhYmxlWyhOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCA+PiAweDA1KV0gPQ0KICAgICAgKHUzMikweDAxIDw8IChOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCAmICh1OCkweDFGKTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggTlZJQ19Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gTlZJQ19Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgTlZJQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU3RydWN0SW5pdChOVklDX0luaXRUeXBlRGVmKiBOVklDX0luaXRTdHJ1Y3QpDQp7DQogIC8qIE5WSUNfSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCiAgTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgPSAweDAwOw0KICBOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFByZWVtcHRpb25Qcmlvcml0eSA9IDB4MDA7DQogIE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsU3ViUHJpb3JpdHkgPSAweDAwOw0KICBOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbENtZCA9IERJU0FCTEU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TRVRQUklNQVNLDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyB0aGUgUFJJTUFTSyBwcmlvcml0eTogUmFpc2VzIHRoZSBleGVjdXRpb24gcHJpb3JpdHkgdG8gMC4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU0VUUFJJTUFTSyh2b2lkKQ0Kew0KICBfX1NFVFBSSU1BU0soKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1JFU0VUUFJJTUFTSw0KKiBEZXNjcmlwdGlvbiAgICA6IERpc2FibGVzIHRoZSBQUklNQVNLIHByaW9yaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19SRVNFVFBSSU1BU0sodm9pZCkNCnsNCiAgX19SRVNFVFBSSU1BU0soKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1NFVEZBVUxUTUFTSw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgdGhlIEZBVUxUTUFTSyBwcmlvcml0eTogUmFpc2VzIHRoZSBleGVjdXRpb24gcHJpb3JpdHkgdG8gLTEuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1NFVEZBVUxUTUFTSyh2b2lkKQ0Kew0KICBfX1NFVEZBVUxUTUFTSygpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfUkVTRVRGQVVMVE1BU0sNCiogRGVzY3JpcHRpb24gICAgOiBEaXNhYmxlcyB0aGUgRkFVTFRNQVNLIHByaW9yaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19SRVNFVEZBVUxUTUFTSyh2b2lkKQ0Kew0KICBfX1JFU0VURkFVTFRNQVNLKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19CQVNFUFJJQ09ORklHDQoqIERlc2NyaXB0aW9uICAgIDogVGhlIGV4ZWN1dGlvbiBwcmlvcml0eSBjYW4gYmUgY2hhbmdlZCBmcm9tIDE1IChsb3dlc3QgDQogICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlIHByaW9yaXR5KSB0byAxLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19CQVNFUFJJQ09ORklHKHUzMiBOZXdQcmlvcml0eSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX05WSUNfQkFTRV9QUkkoTmV3UHJpb3JpdHkpKTsNCiAgDQogIF9fQkFTRVBSSUNPTkZJRyhOZXdQcmlvcml0eSA8PCAweDA0KTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0dldEJBU0VQUkkNCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBCQVNFUFJJIG1hc2sgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBCQVNFUFJJIHJlZ2lzdGVyIHZhbHVlDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTMyIE5WSUNfR2V0QkFTRVBSSSh2b2lkKQ0Kew0KICByZXR1cm4gKF9fR2V0QkFTRVBSSSgpKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0dldEN1cnJlbnRQZW5kaW5nSVJRQ2hhbm5lbA0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIGN1cnJlbnQgcGVuZGluZyBJUlEgY2hhbm5lbCBpZGVudGlmaWVyLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogUGVuZGluZyBJUlEgQ2hhbm5lbCBJZGVudGlmaWVyLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBOVklDX0dldEN1cnJlbnRQZW5kaW5nSVJRQ2hhbm5lbCh2b2lkKQ0Kew0KICByZXR1cm4gKCh1MTYpKChTQ0ItPklSUUNvbnRyb2xTdGF0ZSAmICh1MzIpMHgwMDNGRjAwMCkgPj4gMHgwQykpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0SVJRQ2hhbm5lbFBlbmRpbmdCaXRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSUSBDaGFubmVsIHBlbmRpbmcgYml0IGlzIHNldA0KKiAgICAgICAgICAgICAgICAgIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIE5WSUNfSVJRQ2hhbm5lbDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgSVJRIENoYW5uZWwgcGVuZGluZyBiaXQoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBOVklDX0dldElSUUNoYW5uZWxQZW5kaW5nQml0U3RhdHVzKHU4IE5WSUNfSVJRQ2hhbm5lbCkNCnsNCiAgSVRTdGF0dXMgcGVuZGluZ2lycXN0YXR1cyA9IFJFU0VUOw0KICB1MzIgdG1wID0gMHgwMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19OVklDX0lSUV9DSEFOTkVMKE5WSUNfSVJRQ2hhbm5lbCkpOw0KICANCiAgdG1wID0gKCh1MzIpMHgwMSA8PCAoTlZJQ19JUlFDaGFubmVsICYgKHUzMikweDFGKSk7DQoNCiAgaWYgKCgoTlZJQy0+U2V0WyhOVklDX0lSUUNoYW5uZWwgPj4gMHgwNSldKSAmIHRtcCkgPT0gdG1wKQ0KICB7DQogICAgcGVuZGluZ2lycXN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBwZW5kaW5naXJxc3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIHBlbmRpbmdpcnFzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TZXRJUlFDaGFubmVsUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIE5WSUOScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0lSUUNoYW5uZWw6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIFNldC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19TZXRJUlFDaGFubmVsUGVuZGluZ0JpdCh1OCBOVklDX0lSUUNoYW5uZWwpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19OVklDX0lSUV9DSEFOTkVMKE5WSUNfSVJRQ2hhbm5lbCkpOw0KICANCiAgKih1MzIqKTB4RTAwMEVGMDAgPSAodTMyKU5WSUNfSVJRQ2hhbm5lbDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0NsZWFySVJRQ2hhbm5lbFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIE5WSUOScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0lSUUNoYW5uZWw6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0NsZWFySVJRQ2hhbm5lbFBlbmRpbmdCaXQodTggTlZJQ19JUlFDaGFubmVsKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfTlZJQ19JUlFfQ0hBTk5FTChOVklDX0lSUUNoYW5uZWwpKTsNCiAgDQogIE5WSUMtPkNsZWFyWyhOVklDX0lSUUNoYW5uZWwgPj4gMHgwNSldID0gKHUzMikweDAxIDw8IChOVklDX0lSUUNoYW5uZWwgJiAodTMyKTB4MUYpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0Q3VycmVudEFjdGl2ZUhhbmRsZXINCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGl2ZSBIYW5kbGVyIChJUlEgQ2hhbm5lbCBhbmQNCiogICAgICAgICAgICAgICAgICBTeXN0ZW1IYW5kbGVyKSBpZGVudGlmaWVyLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQWN0aXZlIEhhbmRsZXIgSWRlbnRpZmllci4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgTlZJQ19HZXRDdXJyZW50QWN0aXZlSGFuZGxlcih2b2lkKQ0Kew0KICByZXR1cm4gKCh1MTYpKFNDQi0+SVJRQ29udHJvbFN0YXRlICYgKHUzMikweDNGRikpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0SVJRQ2hhbm5lbEFjdGl2ZUJpdFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJRIENoYW5uZWwgYWN0aXZlIGJpdCBpcyBzZXQNCiogICAgICAgICAgICAgICAgICBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0lSUUNoYW5uZWw6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGFjdGl2ZSBiaXQgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgSVJRIENoYW5uZWwgYWN0aXZlIGJpdChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIE5WSUNfR2V0SVJRQ2hhbm5lbEFjdGl2ZUJpdFN0YXR1cyh1OCBOVklDX0lSUUNoYW5uZWwpDQp7DQogIElUU3RhdHVzIGFjdGl2ZWlycXN0YXR1cyA9IFJFU0VUOw0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfTlZJQ19JUlFfQ0hBTk5FTChOVklDX0lSUUNoYW5uZWwpKTsNCiAgDQogIHRtcCA9ICgodTMyKTB4MDEgPDwgKE5WSUNfSVJRQ2hhbm5lbCAmICh1MzIpMHgxRikpOw0KDQogIGlmICgoKE5WSUMtPkFjdGl2ZVsoTlZJQ19JUlFDaGFubmVsID4+IDB4MDUpXSkgJiB0bXApID09IHRtcCApDQogIHsNCiAgICBhY3RpdmVpcnFzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYWN0aXZlaXJxc3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGFjdGl2ZWlycXN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0dldENQVUlEDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgSUQgbnVtYmVyLCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbg0KKiAgICAgICAgICAgICAgICAgIGRldGFpbHMgb2YgdGhlIENvcnRleC1NMyBjb3JlLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQ1BVIElELg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBOVklDX0dldENQVUlEKHZvaWQpDQp7DQogIHJldHVybiAoU0NCLT5DUFVJRCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TZXRWZWN0b3JUYWJsZQ0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIHZlY3RvciB0YWJsZSBsb2NhdGlvbiBhbmQgT2Zmc2V0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gTlZJQ19WZWN0VGFiOiBzcGVjaWZpZXMgaWYgdGhlIHZlY3RvciB0YWJsZSBpcyBpbiBSQU0gb3INCiogICAgICAgICAgICAgICAgICAgIGNvZGUgbWVtb3J5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19WZWN0VGFiX1JBTQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBOVklDX1ZlY3RUYWJfRkxBU0gNCiogICAgICAgICAgICAgICAgICAtIE9mZnNldDogVmVjdG9yIFRhYmxlIGJhc2Ugb2Zmc2V0IGZpZWxkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1NldFZlY3RvclRhYmxlKHUzMiBOVklDX1ZlY3RUYWIsIHUzMiBPZmZzZXQpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfTlZJQ19WRUNUVEFCKE5WSUNfVmVjdFRhYikpOw0KICBhc3NlcnQoSVNfTlZJQ19PRkZTRVQoT2Zmc2V0KSk7ICANCiAgIA0KICBTQ0ItPkV4Y2VwdGlvblRhYmxlT2Zmc2V0ID0gKCgodTMyKU9mZnNldCA8PCAweDA3KSAmICh1MzIpMHgxRkZGRkY4MCk7DQoNCiAgU0NCLT5FeGNlcHRpb25UYWJsZU9mZnNldCB8PSBOVklDX1ZlY3RUYWI7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZW5lcmF0ZVN5c3RlbVJlc2V0DQoqIERlc2NyaXB0aW9uICAgIDogR2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19HZW5lcmF0ZVN5c3RlbVJlc2V0KHZvaWQpDQp7DQogIFNDQi0+QUlSQyA9IEFJUkNfVkVDVEtFWV9NQVNLIHwgKHUzMikweDA0Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2VuZXJhdGVDb3JlUmVzZXQNCiogRGVzY3JpcHRpb24gICAgOiBHZW5lcmF0ZXMgYSBDb3JlIChDb3JlICsgTlZJQykgcmVzZXQuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0dlbmVyYXRlQ29yZVJlc2V0KHZvaWQpDQp7DQogIFNDQi0+QUlSQyA9IEFJUkNfVkVDVEtFWV9NQVNLIHwgKHUzMikweDAxOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU3lzdGVtTFBDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBjb25kaXRpb24gZm9yIHRoZSBzeXN0ZW0gdG8gZW50ZXIgbG93IHBvd2VyIG1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBMb3dQb3dlck1vZGU6IFNwZWNpZmllcyB0aGUgbmV3IG1vZGUgZm9yIHRoZSBzeXN0ZW0gdG8gZW50ZXINCiogICAgICAgICAgICAgICAgICAgIGxvdyBwb3dlciBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19MUF9TRVZPTlBFTkQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19MUF9TTEVFUERFRVANCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19MUF9TTEVFUE9ORVhJVA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiBMUCBjb25kaXRpb24uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1N5c3RlbUxQQ29uZmlnKHU4IExvd1Bvd2VyTW9kZSwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfTlZJQ19MUChMb3dQb3dlck1vZGUpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsgIA0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICBTQ0ItPlN5c0N0cmwgfD0gTG93UG93ZXJNb2RlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFNDQi0+U3lzQ3RybCAmPSAodTMyKSh+KHUzMilMb3dQb3dlck1vZGUpOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TeXN0ZW1IYW5kbGVyQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFN5c3RlbSBIYW5kbGVycy4NCiogSW5wdXQgICAgICAgICAgOiAtIFN5c3RlbUhhbmRsZXI6IHNwZWNpZmllcyB0aGUgc3lzdGVtIGhhbmRsZXIgdG8gYmUgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX01lbW9yeU1hbmFnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX0J1c0ZhdWx0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfVXNhZ2VGYXVsdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiAgc3BlY2lmaWVkIFN5c3RlbSBIYW5kbGVycy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU3lzdGVtSGFuZGxlckNvbmZpZyh1MzIgU3lzdGVtSGFuZGxlciwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICB1MzIgdG1wcmVnID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ09ORklHX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsgDQogIA0KICB0bXByZWcgPSAgKHUzMikweDAxIDw8IChTeXN0ZW1IYW5kbGVyICYgKHUzMikweDFGKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFNDQi0+U3lzSGFuZGxlckN0cmwgfD0gdG1wcmVnOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFNDQi0+U3lzSGFuZGxlckN0cmwgJj0gfnRtcHJlZzsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU3lzdGVtSGFuZGxlclByaW9yaXR5Q29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIFN5c3RlbSBIYW5kbGVycyBwcmlvcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIFN5c3RlbUhhbmRsZXI6IHNwZWNpZmllcyB0aGUgc3lzdGVtIGhhbmRsZXIgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX01lbW9yeU1hbmFnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX0J1c0ZhdWx0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfVXNhZ2VGYXVsdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1NWQ2FsbA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX0RlYnVnTW9uaXRvcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1BTVg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1N5c1RpY2sNCiogICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJQcmVlbXB0aW9uUHJpb3JpdHk6IG5ldyBwcmlvcml0eSBncm91cCBvZiB0aGUNCiogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBzeXN0ZW0gaGFuZGxlcnMuDQoqICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyU3ViUHJpb3JpdHk6IG5ldyBzdWIgcHJpb3JpdHkgb2YgdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGhhbmRsZXJzLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1N5c3RlbUhhbmRsZXJQcmlvcml0eUNvbmZpZyh1MzIgU3lzdGVtSGFuZGxlciwgdTggU3lzdGVtSGFuZGxlclByZWVtcHRpb25Qcmlvcml0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggU3lzdGVtSGFuZGxlclN1YlByaW9yaXR5KQ0Kew0KICB1MzIgdG1wMSA9IDB4MDAsIHRtcDIgPSAweEZGLCBoYW5kbGVybWFzayA9IDB4MDA7DQogIHUzMiB0bXBwcmlvcml0eSA9IDB4MDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1BSSU9SSVRZX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgYXNzZXJ0KElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShTeXN0ZW1IYW5kbGVyUHJlZW1wdGlvblByaW9yaXR5KSk7ICANCiAgYXNzZXJ0KElTX05WSUNfU1VCX1BSSU9SSVRZKFN5c3RlbUhhbmRsZXJTdWJQcmlvcml0eSkpOw0KICAgIA0KICB0bXBwcmlvcml0eSA9ICgweDcwMCAtIChTQ0ItPkFJUkMgJiAodTMyKTB4NzAwKSk+PiAweDA4Ow0KICB0bXAxID0gKDB4NCAtIHRtcHByaW9yaXR5KTsNCiAgdG1wMiA9IHRtcDIgPj4gdG1wcHJpb3JpdHk7DQogICAgDQogIHRtcHByaW9yaXR5ID0gKHUzMilTeXN0ZW1IYW5kbGVyUHJlZW1wdGlvblByaW9yaXR5IDw8IHRtcDE7DQogIHRtcHByaW9yaXR5IHw9ICBTeXN0ZW1IYW5kbGVyU3ViUHJpb3JpdHkgJiB0bXAyOw0KDQogIHRtcHByaW9yaXR5ID0gdG1wcHJpb3JpdHkgPDwgMHgwNDsNCiAgdG1wMSA9IFN5c3RlbUhhbmRsZXIgJiAodTMyKTB4QzA7DQogIHRtcDEgPSB0bXAxID4+IDB4MDY7IA0KICB0bXAyID0gKFN5c3RlbUhhbmRsZXIgPj4gMHgwOCkgJiAodTMyKTB4MDM7DQogIHRtcHByaW9yaXR5ID0gdG1wcHJpb3JpdHkgPDwgKHRtcDIgKiAweDA4KTsNCiAgaGFuZGxlcm1hc2sgPSAodTMyKTB4RkYgPDwgKHRtcDIgKiAweDA4KTsNCiAgDQogIFNDQi0+U3lzdGVtUHJpb3JpdHlbdG1wMV0gJj0gfmhhbmRsZXJtYXNrOw0KICBTQ0ItPlN5c3RlbVByaW9yaXR5W3RtcDFdIHw9IHRtcHByaW9yaXR5Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0U3lzdGVtSGFuZGxlclBlbmRpbmdCaXRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFN5c3RlbSBoYW5kbGVycyBwZW5kaW5nIGJpdCBpcw0KKiAgICAgICAgICAgICAgICAgIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBTeXN0ZW1IYW5kbGVyOiBzcGVjaWZpZXMgdGhlIHN5c3RlbSBoYW5kbGVyIHBlbmRpbmcgYml0IHRvDQoqICAgICAgICAgICAgICAgICAgICBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTWVtb3J5TWFuYWdlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfQnVzRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TVkNhbGwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIE5WSUNfR2V0U3lzdGVtSGFuZGxlclBlbmRpbmdCaXRTdGF0dXModTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyAgPSBSRVNFVDsNCiAgdTMyIHRtcCA9IDB4MDAsIHRtcHBvcyA9IDB4MDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0dFVF9QRU5ESU5HX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgDQogIHRtcHBvcyA9IChTeXN0ZW1IYW5kbGVyID4+IDB4MEEpOw0KICB0bXBwb3MgJj0gKHUzMikweDBGOw0KDQogIHRtcHBvcyA9ICh1MzIpMHgwMSA8PCB0bXBwb3M7DQoNCiAgdG1wID0gU0NCLT5TeXNIYW5kbGVyQ3RybCAmIHRtcHBvczsNCg0KICBpZiAodG1wID09IHRtcHBvcykNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU2V0U3lzdGVtSGFuZGxlclBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIFN5c3RlbSBIYW5kbGVyIHBlbmRpbmcgYml0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciBwZW5kaW5nIGJpdA0KKiAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2V0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9OTUkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9QU1YNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TeXNUaWNrDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU2V0U3lzdGVtSGFuZGxlclBlbmRpbmdCaXQodTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiB0bXAgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19TRVRfUEVORElOR19TWVNURU1fSEFORExFUihTeXN0ZW1IYW5kbGVyKSk7DQogIA0KICAvKiBHZXQgdGhlIFN5c3RlbSBIYW5kbGVyIHBlbmRpbmcgYml0IHBvc2l0aW9uICovDQogIHRtcCA9IFN5c3RlbUhhbmRsZXIgJiAodTMyKTB4MUY7DQogIC8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdCAqLw0KICBTQ0ItPklSUUNvbnRyb2xTdGF0ZSB8PSAoKHUzMikweDAxIDw8IHRtcCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19DbGVhclN5c3RlbUhhbmRsZXJQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIFN5c3RlbSBIYW5kbGVyIHBlbmRpbmcgYml0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciBwZW5kaW5nIGJpdCB0bw0KKiAgICAgICAgICAgICAgICAgICAgYmUgY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1BTVg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1N5c1RpY2sNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19DbGVhclN5c3RlbUhhbmRsZXJQZW5kaW5nQml0KHUzMiBTeXN0ZW1IYW5kbGVyKQ0Kew0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfQ0xFQVJfU1lTVEVNX0hBTkRMRVIoU3lzdGVtSGFuZGxlcikpOw0KICANCiAgLyogR2V0IHRoZSBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdCBwb3NpdGlvbiAqLw0KICB0bXAgPSBTeXN0ZW1IYW5kbGVyICYgKHUzMikweDFGOw0KICAvKiBDbGVhciB0aGUgY29ycmVzcG9uZGluZyBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdCAqLw0KICBTQ0ItPklSUUNvbnRyb2xTdGF0ZSB8PSAoKHUzMikweDAxIDw8ICh0bXAgLSAweDAxKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRTeXN0ZW1IYW5kbGVyQWN0aXZlQml0U3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTeXN0ZW0gaGFuZGxlcnMgYWN0aXZlIGJpdCBpcw0KKiAgICAgICAgICAgICAgICAgIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBTeXN0ZW1IYW5kbGVyOiBzcGVjaWZpZXMgdGhlIHN5c3RlbSBoYW5kbGVyIGFjdGl2ZSBiaXQgdG8NCiogICAgICAgICAgICAgICAgICAgIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9NZW1vcnlNYW5hZ2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9CdXNGYXVsdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1VzYWdlRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TVkNhbGwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9EZWJ1Z01vbml0b3INCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9QU1YNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TeXNUaWNrDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgU3lzdGVtIEhhbmRsZXIgYWN0aXZlIGJpdChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIE5WSUNfR2V0U3lzdGVtSGFuZGxlckFjdGl2ZUJpdFN0YXR1cyh1MzIgU3lzdGVtSGFuZGxlcikNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzICA9IFJFU0VUOw0KDQogIHUzMiB0bXAgPSAweDAwLCB0bXBwb3MgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19HRVRfQUNUSVZFX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgDQogIHRtcHBvcyA9IChTeXN0ZW1IYW5kbGVyID4+IDB4MEUpICYgKHUzMikweDBGOw0KDQogIHRtcHBvcyA9ICh1MzIpMHgwMSA8PCB0bXBwb3M7DQoNCiAgdG1wID0gU0NCLT5TeXNIYW5kbGVyQ3RybCAmIHRtcHBvczsNCg0KICBpZiAodG1wID09IHRtcHBvcykNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0RmF1bHRIYW5kbGVyU291cmNlcw0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIHN5c3RlbSBmYXVsdCBoYW5kbGVycyBzb3VyY2VzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciB0byBnZXQgaXRzIGZhdWx0DQoqICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9IYXJkRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9NZW1vcnlNYW5hZ2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9CdXNGYXVsdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1VzYWdlRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9EZWJ1Z01vbml0b3INCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogU291cmNlIG9mIHRoZSBmYXVsdCBoYW5kbGVyLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBOVklDX0dldEZhdWx0SGFuZGxlclNvdXJjZXModTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiBmYXVsdHNvdXJjZXMgPSAweDAwOw0KICB1MzIgdG1wcmVnID0gMHgwMCwgdG1wcG9zID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRkFVTFRfU09VUkNFX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgDQogIHRtcHJlZyA9IChTeXN0ZW1IYW5kbGVyID4+IDB4MTIpICYgKHUzMikweDAzOw0KICB0bXBwb3MgPSAoU3lzdGVtSGFuZGxlciA+PiAweDE0KSAmICh1MzIpMHgwMzsNCg0KICBpZiAodG1wcmVnID09IDB4MDApDQogIHsNCiAgICBmYXVsdHNvdXJjZXMgPSBTQ0ItPkhhcmRGYXVsdFN0YXR1czsNCiAgfQ0KICBlbHNlIGlmICh0bXByZWcgPT0gMHgwMSkNCiAgew0KICAgIGZhdWx0c291cmNlcyA9IFNDQi0+Q29uZmlnRmF1bHRTdGF0dXMgPj4gKHRtcHBvcyAqIDB4MDgpOw0KICAgIGlmICh0bXBwb3MgIT0gMHgwMikNCiAgICB7DQogICAgICBmYXVsdHNvdXJjZXMgJj0gKHUzMikweDBGOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgZmF1bHRzb3VyY2VzICY9ICh1MzIpMHhGRjsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgZmF1bHRzb3VyY2VzID0gU0NCLT5EZWJ1Z0ZhdWx0U3RhdHVzOw0KICB9DQogIHJldHVybiBmYXVsdHNvdXJjZXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRGYXVsdEFkZHJlc3MNCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiB0aGF0IGdlbmVyYXRlZCBhIGZhdWx0DQoqICAgICAgICAgICAgICAgICAgaGFuZGxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFN5c3RlbUhhbmRsZXI6IHNwZWNpZmllcyB0aGUgc3lzdGVtIGhhbmRsZXIgdG8gZ2V0IGl0cw0KKiAgICAgICAgICAgICAgICAgICAgZmF1bHQgYWRkcmVzcy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTWVtb3J5TWFuYWdlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfQnVzRmF1bHQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogRmF1bHQgYWRkcmVzcy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgTlZJQ19HZXRGYXVsdEFkZHJlc3ModTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiBmYXVsdGFkZHJlc3MgPSAweDAwOw0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRkFVTFRfQUREUkVTU19TWVNURU1fSEFORExFUihTeXN0ZW1IYW5kbGVyKSk7DQogIA0KICB0bXAgPSAoU3lzdGVtSGFuZGxlciA+PiAweDE2KSAmICh1MzIpMHgwMTsNCg0KICBpZiAodG1wID09IDB4MDApDQogIHsNCiAgICBmYXVsdGFkZHJlc3MgPSBTQ0ItPk1lbW9yeU1hbmFnZUZhdWx0QWRkcjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBmYXVsdGFkZHJlc3MgPSBTQ0ItPkJ1c0ZhdWx0QWRkcjsNCiAgfQ0KICByZXR1cm4gZmF1bHRhZGRyZXNzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDcgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K