LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAyMSBBdmFsb3EuDQogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlDQogKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMA0KICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvDQogKg0KICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjANCiAqDQogKiBDb250cmlidXRvcnM6DQogKiAgUnVi6W4gUG9ycmFzIENhbXBvIChBdmFsb3EpIC0gQnVnIDU3NjQyNSAtIFN1cHBvcnQgUmVtb3RlIEZpbGVzDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2UubHNwNGUudGVzdDsNCg0KaW1wb3J0IGphdmEubmV0LlVSSTsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5sc3A0ZS50ZXN0LmVkaXQuTFNQRWNsaXBzZVV0aWxzVGVzdDsNCg0KLyoqDQogKiBBIGN1c3RvbSBVUkkgdG8gUmVzb3VyY2UgTWFwcGVyIHRvIHRlc3QgbWFwcGluZyBvZiByZW1vdGUgVVJJcyBieSBzdHJpcHBpbmcgdGhlIHNlZ21lbnQgIi9hLyIsDQogKiBpdCBpcyB0aWdobHkgY291cGxlZCB3aXRoIHtAbGluayBMU1BFY2xpcHNlVXRpbHNUZXN0I3Rlc3RVUklUb0xpbmtlZFJlc291cmNlTWFwcGluZygpfQ0KICoNCiAqLw0KcHVibGljIGNsYXNzIFVyaVRvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeXsNCg0KDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFfU0VHTUVOVCA9ICIvYS8iOw0KDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJICBAT3ZlcnJpZGUNCgkgIHB1YmxpYyA8VD4gVCBnZXRBZGFwdGVyKGZpbmFsIE9iamVjdCBhZGFwdGFibGVPYmplY3QsIGZpbmFsIENsYXNzPFQ+IGFkYXB0ZXJUeXBlKSB7DQoJICAgIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCgkgICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlKCgoU3RyaW5nKSBhZGFwdGFibGVPYmplY3QpLnJlcGxhY2UoQV9TRUdNRU5ULCAiIikpOw0KCSAgICAgICAgU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOw0KCSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChMU1BFY2xpcHNlVXRpbHNUZXN0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSArIHVyaS5nZXRTY2hlbWUoKSk7DQoJICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7DQoJICAgICAgICAgIGlmIChhZGFwdGVyVHlwZSA9PSBJUmVzb3VyY2UuY2xhc3MpIHsNCgkgICAgICAgICAgICByZXR1cm4gKFQpIHByb2plY3QuZmluZE1lbWJlcihwYXRoKTsNCgkgICAgICAgICAgfSBlbHNlIGlmIChhZGFwdGVyVHlwZSA9PSBJRmlsZS5jbGFzcykgew0KCSAgICAgICAgICAgIHJldHVybiAoVCkgcHJvamVjdC5nZXRGaWxlKHBhdGgpOw0KCSAgICAgICAgICB9DQoJICAgICAgICB9DQoJICAgIH0gZWxzZSBpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsNCgkgICAgCVVSSSB1cmkgPSAoKElSZXNvdXJjZSlhZGFwdGFibGVPYmplY3QpLmdldExvY2F0aW9uVVJJKCk7DQoJICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KExTUEVjbGlwc2VVdGlsc1Rlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgdXJpLmdldFNjaGVtZSgpKTsNCgkgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgdXJpLmdldFNjaGVtZSgpLmVxdWFscygib3RoZXIiKSkgew0KCSAgICAgICAgCXJldHVybiAoVCkgVVJJLmNyZWF0ZSh1cmkudG9TdHJpbmcoKS5yZXBsYWNlQWxsKCIvLyIsICIvIiArIEFfU0VHTUVOVCkpOw0KCSAgICAgICAgfQ0KCSAgICB9DQoJICAgIHJldHVybiBudWxsOw0KCSAgfQ0KDQoJICBAT3ZlcnJpZGUNCgkgIHB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgew0KCSAgICByZXR1cm4gbmV3IENsYXNzPD8+W10ge0lSZXNvdXJjZS5jbGFzcywgSUZpbGUuY2xhc3MsIFVSSS5jbGFzc307DQoJICB9DQp9DQo=