LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCkNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4NCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUNCndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbA0KoA0KQ29udHJpYnV0b3JzOg0KICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCg0KLyoqDQogKiBDb21tb24gcHJvdG9jb2wgZm9yIGFsbCBlbGVtZW50cyBwcm92aWRlZCBieSB0aGUgSmF2YSBtb2RlbC4NCiAqIEphdmEgbW9kZWwgZWxlbWVudHMgYXJlIGV4cG9zZWQgdG8gY2xpZW50cyBhcyBoYW5kbGVzIHRvIHRoZSBhY3R1YWwgdW5kZXJseWluZyBlbGVtZW50Lg0KICogVGhlIEphdmEgbW9kZWwgbWF5IGhhbmQgb3V0IGFueSBudW1iZXIgb2YgaGFuZGxlcyBmb3IgZWFjaCBlbGVtZW50LiBIYW5kbGVzDQogKiB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGVsZW1lbnQgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZXF1YWwsIGJ1dCBub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsLg0KICogPHA+DQogKiBNZXRob2RzIGFubm90YXRlZCBhcyAiaGFuZGxlLW9ubHkiIGRvIG5vdCByZXF1aXJlIHVuZGVybHlpbmcgZWxlbWVudHMgdG8gZXhpc3QuIA0KICogTWV0aG9kcyB0aGF0IHJlcXVpcmUgdW5kZXJseWluZyBlbGVtZW50cyB0byBleGlzdCB0aHJvdw0KICogYSA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb248L2NvZGU+IHdoZW4gYW4gdW5kZXJseWluZyBlbGVtZW50IGlzIG1pc3NpbmcuDQogKiA8Y29kZT5KYXZhTW9kZWxFeGNlcHRpb24uaXNEb2VzTm90RXhpc3Q8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHJlY29nbml6ZQ0KICogdGhpcyBjb21tb24gc3BlY2lhbCBjYXNlLg0KICogPC9wPg0KICogPHA+DQogKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4NCiAqIDwvcD4NCiAqLw0KcHVibGljIGludGVyZmFjZSBJSmF2YUVsZW1lbnQgZXh0ZW5kcyBJQWRhcHRhYmxlIHsNCg0KCS8qKg0KCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgbW9kZWwgKHdvcmtzcGFjZSBsZXZlbCBvYmplY3QpLg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JSmF2YU1vZGVsPC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX01PREVMID0gMTsNCg0KCS8qKg0KCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIEphdmEgcHJvamVjdC4NCgkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX1BST0pFQ1QgPSAyOw0KDQoJLyoqDQoJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBmcmFnbWVudCByb290Lg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4uDQoJICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRV9GUkFHTUVOVF9ST09UID0gMzsNCg0KCS8qKg0KCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIHBhY2thZ2UgZnJhZ21lbnQuDQoJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklQYWNrYWdlRnJhZ21lbnQ8L2NvZGU+Lg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBQ0tBR0VfRlJBR01FTlQgPSA0Ow0KDQoJLyoqDQoJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgSmF2YSBjb21waWxhdGlvbiB1bml0Lg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JQ29tcGlsYXRpb25Vbml0PC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QSUxBVElPTl9VTklUID0gNTsNCg0KCS8qKg0KCSAqIENvbnN0YW50IHJlcHJlc2VudGluZyBhIGNsYXNzIGZpbGUuDQoJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklDbGFzc0ZpbGU8L2NvZGU+Lg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0ZJTEUgPSA2Ow0KDQoJLyoqDQoJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgdHlwZSAoYSBjbGFzcyBvciBpbnRlcmZhY2UpLg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JVHlwZTwvY29kZT4uDQoJICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDc7DQoNCgkvKioNCgkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBmaWVsZC4NCgkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUZpZWxkPC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRCA9IDg7DQoNCgkvKioNCgkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBtZXRob2Qgb3IgY29uc3RydWN0b3IuDQoJICogQSBKYXZhIGVsZW1lbnQgd2l0aCB0aGlzIHR5cGUgY2FuIGJlIHNhZmVseSBjYXN0IHRvIDxjb2RlPklNZXRob2Q8L2NvZGU+Lg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDk7DQoNCgkvKioNCgkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYSBzdGFuZC1hbG9uZSBpbnN0YW5jZSBvciBjbGFzcyBpbml0aWFsaXplci4NCgkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUluaXRpYWxpemVyPC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpFUiA9IDEwOw0KDQoJLyoqDQoJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGEgcGFja2FnZSBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0Lg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JUGFja2FnZURlY2xhcmF0aW9uPC9jb2RlPi4NCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFX0RFQ0xBUkFUSU9OID0gMTE7DQoNCgkvKioNCgkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgYWxsIGltcG9ydCBkZWNsYXJhdGlvbnMgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4NCgkgKiBBIEphdmEgZWxlbWVudCB3aXRoIHRoaXMgdHlwZSBjYW4gYmUgc2FmZWx5IGNhc3QgdG8gPGNvZGU+SUltcG9ydENvbnRhaW5lcjwvY29kZT4uDQoJICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUX0NPTlRBSU5FUiA9IDEyOw0KDQoJLyoqDQoJICogQ29uc3RhbnQgcmVwcmVzZW50aW5nIGFuIGltcG9ydCBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjb21waWxhdGlvbiB1bml0Lg0KCSAqIEEgSmF2YSBlbGVtZW50IHdpdGggdGhpcyB0eXBlIGNhbiBiZSBzYWZlbHkgY2FzdCB0byA8Y29kZT5JSW1wb3J0RGVjbGFyYXRpb248L2NvZGU+Lg0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVF9ERUNMQVJBVElPTiA9IDEzOw0KDQovKioNCiAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBleGlzdHMgaW4gdGhlIG1vZGVsLg0KICoNCiAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGV4aXN0cyBpbiB0aGUgSmF2YSBtb2RlbA0KICovDQpib29sZWFuIGV4aXN0cygpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBmaXJzdCBhbmNlc3RvciBvZiB0aGlzIEphdmEgZWxlbWVudCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdHlwZS4NCiAqIFJldHVybnMgdGhpcyBlbGVtZW50IGlmIGl0IGhhcyB0aGUgZ2l2ZW4gdHlwZS4NCiAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3VjaCBhbiBhbmNlc3RvciBjYW4gYmUgZm91bmQuDQogKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLg0KICogDQogKiBAc2luY2UgMi4wDQogKi8NCklKYXZhRWxlbWVudCBnZXRBbmNlc3RvcihpbnQgYW5jZXN0b3JUeXBlKTsNCi8qKg0KICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGhhdCBjb3JyZXNwb25kcyBkaXJlY3RseSB0byB0aGlzIGVsZW1lbnQsDQogKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyByZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvDQogKiB0aGlzIGVsZW1lbnQuDQogKiA8cD4NCiAqIEZvciBleGFtcGxlLCB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBmb3IgYW4gPGNvZGU+SUNvbXBpbGF0aW9uVW5pdDwvY29kZT4NCiAqIGlzIGl0cyB1bmRlcmx5aW5nIDxjb2RlPklGaWxlPC9jb2RlPi4gVGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZm9yDQogKiBhbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPiB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYW4gYXJjaGl2ZSANCiAqIGlzIGl0cyB1bmRlcmx5aW5nIDxjb2RlPklGb2xkZXI8L2NvZGU+LiBBbiA8Y29kZT5JUGFja2FnZUZyYWdtZW50PC9jb2RlPg0KICogY29udGFpbmVkIGluIGFuIGFyY2hpdmUgaGFzIG5vIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuIFNpbWlsYXJseSwgdGhlcmUNCiAqIGFyZSBubyBjb3JyZXNwb25kaW5nIHJlc291cmNlcyBmb3IgPGNvZGU+SU1ldGhvZHM8L2NvZGU+LA0KICogPGNvZGU+SUZpZWxkczwvY29kZT4sIGV0Yy4NCiAqIDxwPg0KICoNCiAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUNCiAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoaXMgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBvciBpZiBhbg0KICoJCWV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlDQogKi8NCklSZXNvdXJjZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4gVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4NCiAqDQogKiBAcmV0dXJuIHRoZSBlbGVtZW50IG5hbWUNCiAqLw0KU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7DQovKioNCiAqIFJldHVybnMgdGhpcyBlbGVtZW50J3Mga2luZCBlbmNvZGVkIGFzIGFuIGludGVnZXIuDQogKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLg0KICoNCiAqIEByZXR1cm4gdGhlIGtpbmQgb2YgZWxlbWVudDsgb25lIG9mIHRoZSBjb25zdGFudHMgZGVjbGFyZWQgaW4NCiAqICAgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPg0KICogQHNlZSBJSmF2YUVsZW1lbnQNCiAqLw0KcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpOw0KLyoqDQogKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZWxlbWVudCBoYW5kbGUuIFRoZSBmb3JtYXQgb2YNCiAqIHRoZSBzdHJpbmcgaXMgbm90IHNwZWNpZmllZDsgaG93ZXZlciwgdGhlIGlkZW50aWZpZXIgaXMgc3RhYmxlIGFjcm9zcw0KICogd29ya3NwYWNlIHNlc3Npb25zLCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhpcyBoYW5kbGUgdmlhIHRoZSANCiAqIDxjb2RlPkphdmFDb3JlLmNyZWF0ZShTdHJpbmcpPC9jb2RlPiBtZXRob2QuDQogKg0KICogQHJldHVybiB0aGUgc3RyaW5nIGhhbmRsZSBpZGVudGlmaWVyDQogKiBAc2VlIEphdmFDb3JlI2NyZWF0ZShqYXZhLmxhbmcuU3RyaW5nKQ0KICovDQpTdHJpbmcgZ2V0SGFuZGxlSWRlbnRpZmllcigpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBKYXZhIG1vZGVsLg0KICogVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4NCiAqDQogKiBAcmV0dXJuIHRoZSBKYXZhIG1vZGVsDQogKi8NCklKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCk7DQovKioNCiAqIFJldHVybnMgdGhlIEphdmEgcHJvamVjdCB0aGlzIGVsZW1lbnQgaXMgY29udGFpbmVkIGluLA0KICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQgaW4gYW55IEphdmEgcHJvamVjdA0KICogKGZvciBpbnN0YW5jZSwgdGhlIDxjb2RlPklKYXZhTW9kZWw8L2NvZGU+IGlzIG5vdCBjb250YWluZWQgaW4gYW55IEphdmEgDQogKiBwcm9qZWN0KS4NCiAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuDQogKg0KICogQHJldHVybiB0aGUgY29udGFpbmluZyBKYXZhIHByb2plY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcw0KICogICBub3QgY29udGFpbmVkIGluIGEgSmF2YSBwcm9qZWN0DQogKi8NCklKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBmaXJzdCBvcGVuYWJsZSBwYXJlbnQuIElmIHRoaXMgZWxlbWVudCBpcyBvcGVuYWJsZSwgdGhlIGVsZW1lbnQNCiAqIGl0c2VsZiBpcyByZXR1cm5lZC4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgZG9lc24ndCBoYXZlDQogKiBhbiBvcGVuYWJsZSBwYXJlbnQuDQogKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLg0KICogDQogKiBAc2luY2UgMi4wDQogKi8NCklPcGVuYWJsZSBnZXRPcGVuYWJsZSgpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBlbGVtZW50IGRpcmVjdGx5IGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LA0KICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQuDQogKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLg0KICoNCiAqIEByZXR1cm4gdGhlIHBhcmVudCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaGFzIG5vIHBhcmVudA0KICovDQpJSmF2YUVsZW1lbnQgZ2V0UGFyZW50KCk7DQovKioNCiAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGlubmVybW9zdCByZXNvdXJjZSBlbmNsb3NpbmcgdGhpcyBlbGVtZW50LiANCiAqIElmIHRoaXMgZWxlbWVudCBpcyBub3QgaW5jbHVkZWQgaW4gYW4gZXh0ZXJuYWwgYXJjaGl2ZSwgDQogKiB0aGUgcGF0aCByZXR1cm5lZCBpcyB0aGUgZnVsbCwgYWJzb2x1dGUgcGF0aCB0byB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwgDQogKiByZWxhdGl2ZSB0byB0aGUgd29ya2JlbmNoLiANCiAqIElmIHRoaXMgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiBhbiBleHRlcm5hbCBhcmNoaXZlLCANCiAqIHRoZSBwYXRoIHJldHVybmVkIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBhcmNoaXZlIGluIHRoZSBmaWxlIHN5c3RlbS4NCiAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuDQogKiANCiAqIEBzaW5jZSAyLjANCiAqLw0KSVBhdGggZ2V0UGF0aCgpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBpbm5lcm1vc3QgcmVzb3VyY2UgZW5jbG9zaW5nIHRoaXMgZWxlbWVudC4gDQogKiBJZiB0aGlzIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gYW4gYXJjaGl2ZSBhbmQgdGhpcyBhcmNoaXZlIGlzIG5vdCBleHRlcm5hbCwgDQogKiB0aGlzIGlzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyY2hpdmUuIA0KICogSWYgdGhpcyBlbGVtZW50IGlzIGluY2x1ZGVkIGluIGFuIGV4dGVybmFsIGFyY2hpdmUsIDxjb2RlPm51bGw8L2NvZGU+DQogKiBpcyByZXR1cm5lZC4NCiAqIElmIHRoaXMgZWxlbWVudCBpcyBhIHdvcmtpbmcgY29weSwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuDQogKiBUaGlzIGlzIGEgaGFuZGxlLW9ubHkgbWV0aG9kLg0KICogDQogKiBAc2luY2UgMi4wDQogKi8NCklSZXNvdXJjZSBnZXRSZXNvdXJjZSgpOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCB1bmRlcmx5aW5nIHJlc291cmNlIHRoYXQgY29udGFpbnMNCiAqIHRoaXMgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbGVtZW50IGlzIG5vdCBjb250YWluZWQNCiAqIGluIGEgcmVzb3VyY2UuDQogKg0KICogQHJldHVybiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQ0KICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhpcyBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuDQogKgkJZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UNCiAqLw0KSVJlc291cmNlIGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQovKioNCiAqIFJldHVybnMgd2hldGhlciB0aGlzIEphdmEgZWxlbWVudCBpcyByZWFkLW9ubHkuIEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5DQogKiBpZiBpdHMgc3RydWN0dXJlIGNhbm5vdCBiZSBtb2RpZmllZCBieSB0aGUgamF2YSBtb2RlbC4gDQogKiA8cD4NCiAqIE5vdGUgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBJUmVzb3VyY2UuaXNSZWFkT25seSgpLiBGb3IgZXhhbXBsZSwgLmphcg0KICogZmlsZXMgYXJlIHJlYWQtb25seSBhcyB0aGUgamF2YSBtb2RlbCBkb2Vzbid0IGtub3cgaG93IHRvIGFkZC9yZW1vdmUgDQogKiBlbGVtZW50cyBpbiB0aGlzIGZpbGUsIGJ1dCB0aGUgdW5kZXJseWluZyBJRmlsZSBjYW4gYmUgd3JpdGFibGUuDQogKiA8cD4NCiAqIFRoaXMgaXMgYSBoYW5kbGUtb25seSBtZXRob2QuDQogKg0KICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGVsZW1lbnQgaXMgcmVhZC1vbmx5DQogKi8NCmJvb2xlYW4gaXNSZWFkT25seSgpOw0KLyoqDQogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGVsZW1lbnQgaXMga25vd24uIEZvciBleGFtcGxlLCBmb3IgYQ0KICogY29tcGlsYXRpb24gdW5pdCB0aGF0IGNvdWxkIG5vdCBiZSBwYXJzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZC4NCiAqIElmIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gZWxlbWVudCBpcyB1bmtub3duLCBuYXZpZ2F0aW9ucyB3aWxsIHJldHVybiByZWFzb25hYmxlDQogKiBkZWZhdWx0cy4gRm9yIGV4YW1wbGUsIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiB3aWxsIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uLg0KICogPHA+DQogKiBOb3RlOiBUaGlzIGRvZXMgbm90IGltcGx5IGFueXRoaW5nIGFib3V0IGNvbnNpc3RlbmN5IHdpdGggdGhlDQogKiB1bmRlcmx5aW5nIHJlc291cmNlL2J1ZmZlciBjb250ZW50cy4NCiAqIDwvcD4NCiAqDQogKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBlbGVtZW50IGlzIGtub3duDQogKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIGVsZW1lbnQgZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4NCiAqCQlleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZQ0KICovDQpib29sZWFuIGlzU3RydWN0dXJlS25vd24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KfQ0K