LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNyBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC0yLjAvRVBMLTIuMC5odG1sDQogKg0KICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjANCiAqDQogKiBDb250cmlidXRvcnM6DQogKiAgIEh1YXNjYXIgRXNwaW5vemEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgSWRveWEgRGVsIFLtbyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBNYXJpIENhcm1lbiBQYWxhY2lvcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioNCiAqLw0KcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLnJldXNlLnZpZXdzOw0KDQppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuTWFwOw0KaW1wb3J0IGphdmEudXRpbC5TZXQ7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLkNET09iamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmNvbW1vbi5pZC5DRE9JRDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmNvbW1vbi5zZWN1cml0eS5DRE9QZXJtaXNzaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uY29tbW9uLnV0aWwuQ0RPRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS5EYXduRWRpdG9ySW5wdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZUZvbGRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZU5vZGU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5zZXNzaW9uLkNET1Nlc3Npb247DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby50cmFuc2FjdGlvbi5DRE9UcmFuc2FjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnV0aWwuQ0RPVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5pbXBsLkRpYWdyYW1JbXBsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLmltcGwuU2hhcGVJbXBsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5Bc3N1cmFuY2VBc3NldEV2ZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3NldHNQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3N1cmFuY2VQcm9qZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3N1cmFuY2Vwcm9qZWN0RmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLmFzc3VyYW5jZXByb2plY3QuQXNzdXJhbmNlcHJvamVjdFBhY2thZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai5hc3N1cmFuY2Vwcm9qZWN0LkJhc2VsaW5lQ29uZmlnOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC51dGlscy5EYXduQXJnRGlhZ3JhbVV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai51dGlscy53aWRnZXQuQ2hlY2tib3hUcmVlVmlld2VyRXh0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlRnJhbWV3b3JrOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3REZWZpbml0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdE1vZGVsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5wcmVzZW50YXRpb24uRXZpZGVuY2VFZGl0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcucHJlc2VudGF0aW9uLkFyZ0VkaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUucHJlc2VudGF0aW9uLkJhc2VsaW5lRWRpdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBhbS5wcm9jc3BlYy5wcm9jZXNzLnByZXNlbnRhdGlvbi5Qcm9jZXNzRWRpdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmluZnJhLm1hcHBpbmdzLm1hcHBpbmcuTWFwR3JvdXA7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuQWN0aXZpdHk7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuUGFydGljaXBhbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuUHJvY2Vzc01vZGVsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkNhc2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2xhaW07DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuTW9kZWxFbGVtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7DQoNCg0KcHVibGljIGNsYXNzIFJldXNlQXNzaXN0YW5jZVZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7DQoJLy8gTUNQIENyb3NzUHJvamVjdAkNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0RJQUdSQU0gPSAiX2RpYWdyYW0iOw0KCXByaXZhdGUgTWFwPFN0cmluZywgRU9iamVjdD4gZUlEVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVPYmplY3Q+KCk7IC8vIG9ubHkgZm9yIGFyZyBtb2RlbCBlbGVtZW50cw0KCS8vIE1DUCBDcm9zc1Byb2plY3QJDQoNCglwcm90ZWN0ZWQgQXJyYXlMaXN0PFN0cmluZz4gc1Jlc3VsdCA9IG51bGw7DQoJDQoJcHJpdmF0ZSBDRE9TZXNzaW9uIHNlc3Npb25DRE8gPSBudWxsOw0KCXByaXZhdGUgQ0RPUmVzb3VyY2UgcmVzb3VyY2VBUFNvdXJjZSA9IG51bGw7IAkJLy8gUmVzb3VyY2UgU291cmNlIEFzc3VyYW5jZSBwcm9qZWN0DQoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RTb3VyY2U7CS8vbW9kZWwgU291cmNlIEFzc3VyYW5jZSBwcm9qZWN0DQoJcHJpdmF0ZSBDRE9SZXNvdXJjZSByZXNvdXJjZUFQVGFyZ2V0ID0gbnVsbDsgDQoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RUYXJnZXQ7Ly9tb2RlbCBUYXJnZXQgQXNzdXJhbmNlIHByb2plY3QNCgkNCglwcml2YXRlIENET1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uQ0RPID0gbnVsbDsNCgkNCglwcml2YXRlIE1hcDxDRE9SZXNvdXJjZSwgT2JqZWN0W10+IGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCXByaXZhdGUgTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4gYXJnQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCXByaXZhdGUgTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4gcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cyA9IG5ldyBIYXNoTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4oKTsNCglwcml2YXRlIE1hcDxDRE9SZXNvdXJjZSwgT2JqZWN0W10+IGJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCQ0KCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNoZWNrdHJlZUJhc2VsaW5lU291cmNlOw0KCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNoZWNrdHJlZUFyZ1NvdXJjZTsNCgkNCgkNCglwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlckV4dCBjaGVja3RyZWVQcm9jZXNzU291cmNlOw0KCQ0KCXByaXZhdGUgQ0RPUmVzb3VyY2UgYmFzZWxpbmVSZXNvdXJjZSA9IG51bGw7DQoJDQoJcHJpdmF0ZSBDb21ibyBzb3VyY2VQcm9qZWN0Q29tYm87DQoJcHJpdmF0ZSBMYWJlbCBzb3VyY2VMYWJlbDsNCglwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlckV4dCBjaGVja3RyZWVFdmlkZW5jZVNvdXJjZTsNCgkJCQ0KCXByaXZhdGUgTGFiZWwgdGFyZ2V0TGFiZWw7DQoJcHJpdmF0ZSBDb21ibyB0YXJnZXRQcm9qZWN0Q29tYm87DQoNCglwcml2YXRlICBNYXA8RU9iamVjdCwgRU9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsNCglIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQoNCglwcml2YXRlIEFzc2V0c1BhY2thZ2UgdGFyZ2V0QXNzZXRzUGFja2FnZTsNCgkNCglwcm90ZWN0ZWQgQXNzdXJhbmNlcHJvamVjdFBhY2thZ2UgcHJvamVjdFBhY2thZ2U7DQoJcHJvdGVjdGVkIEFzc3VyYW5jZXByb2plY3RGYWN0b3J5IHByb2plY3RGYWN0b3J5Ow0KCQ0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NVUkFOQ0VQUk9KRUNUID0gIi5hc3N1cmFuY2Vwcm9qZWN0IjsJDQoJDQoJcHJvdGVjdGVkIEJ1dHRvbiByZXVzZUJ0bjsNCglwcm90ZWN0ZWQgQXJyYXlMaXN0PENET1Jlc291cmNlTm9kZT4gcHJvamVjdHM7DQoJcHJvdGVjdGVkIFN0cmluZyBldmlFZGl0b3JJRCA9ICJvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMucHJlc2VudGF0aW9uLkRhd25FdmlkZW5jZUVkaXRvcklEIjsNCglwcm90ZWN0ZWQgU3RyaW5nIGFyZ0VkaXRvcklEID0gIm9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcucHJlc2VudGF0aW9uLkRhd25BcmdFZGl0b3JJRCI7DQoJcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzRWRpdG9ySUQgPSAib3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByZXNlbnRhdGlvbi5EYXduUHJvY2Vzc0VkaXRvcklEIjsNCglwcm90ZWN0ZWQgU3RyaW5nIGJhc2VsaW5lRWRpdG9ySUQgPSAib3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLnByZXNlbnRhdGlvbi5EYXduQmFzZWxpbmVFZGl0b3JJRCI7DQoJDQoJQWN0aW9uIGFkZEl0ZW1BY3Rpb247DQoNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQoJCQkJCSAgICANCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuaW5pdChQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJvdG9jb2woKSwNCgkJICAgICAgICAgIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0U2VydmVyTmFtZSgpKTsNCgkJDQoJCXNlc3Npb25DRE8gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZS5nZXRDdXJyZW50U2Vzc2lvbigpOw0KCQkNCgkJaWYoc2Vzc2lvbkNETyA9PSBudWxsKXsNCgkJCXRyeSB7DQoJCQkJLy9UbyB3YWl0IHRoZSBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgaW4gUmVwb3NpdG9yeSBFeHBsb3JlciBUaHJlYWQNCgkJCQlUaHJlYWQuc2xlZXAoMTUwMCk7DQoJCQkJc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmdldEN1cnJlbnRTZXNzaW9uKCk7DQoJCQkJc2Vzc2lvbkNETyA9IENET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLm9wZW5TZXNzaW9uKCk7DQoJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQoJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaw0KCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQl9DQoJCQkNCgkJfQ0KCQkNCgkJdHJhbnNhY3Rpb25DRE8gPSBzZXNzaW9uQ0RPLm9wZW5UcmFuc2FjdGlvbigpOw0KCQljcmVhdGVBY3Rpb25zKCk7DQoJCWNyZWF0ZVRvb2xiYXIoKTsNCgkJY3JlYXRlUmV1c2VDb250cm9scyhwYXJlbnQpOw0KCQkNCgl9CQ0KCQ0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQoJfQ0KDQoJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmV1c2VDb250cm9scyhDb21wb3NpdGUgcGFyZW50KSB7DQoJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgNCgkJCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOw0KCQlDb21wb3NpdGUgc291cmNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCgkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKTsNCgkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkVORDsNCgkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7DQoJCXNvdXJjZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOw0KCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQoJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOw0KCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsJCQkNCgkJc291cmNlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOw0KCQkNCgkJQ29tcG9zaXRlIGNvbXBvc2l0ZVNvdXJjZVByb2plY3QgPSBuZXcgQ29tcG9zaXRlKHNvdXJjZUNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KCQlHcmlkRGF0YSBkYXRhTmV3ID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOw0KCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOw0KCQljb21wb3NpdGVTb3VyY2VQcm9qZWN0LnNldExheW91dERhdGEoZGF0YU5ldyk7DQoNCgkJR3JpZExheW91dCBsYXlvdXROZXcgPSBuZXcgR3JpZExheW91dCgpOw0KCQlkYXRhTmV3Lmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJbGF5b3V0TmV3Lm1hcmdpbkhlaWdodCA9IDA7DQoJCWxheW91dE5ldy5tYXJnaW5XaWR0aCA9IDA7DQoJCWxheW91dE5ldy5udW1Db2x1bW5zID0gMjsNCgkJY29tcG9zaXRlU291cmNlUHJvamVjdC5zZXRMYXlvdXQobGF5b3V0TmV3KTsNCgkJDQoJCS8vIExhYmVsDQoJCXRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZVNvdXJjZVByb2plY3QsIFNXVC5OT05FKTsNCgkJdGFyZ2V0TGFiZWwuc2V0VGV4dCgiVGFyZ2V0IFByb2plY3Q6Iik7DQoJCUdyaWREYXRhIHRhcmdldExhYmVsR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsJCQ0KCQl0YXJnZXRMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJdGFyZ2V0TGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQl0YXJnZXRMYWJlbC5zZXRMYXlvdXREYXRhKHRhcmdldExhYmVsR3JpZERhdGEpOw0KCQl0YXJnZXRQcm9qZWN0Q29tYm89bmV3IENvbWJvKGNvbXBvc2l0ZVNvdXJjZVByb2plY3QsU1dULk5PTkUpOw0KCQlHcmlkRGF0YSB0YXJnZXRDb21ib0dyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7CQkNCgkJdGFyZ2V0Q29tYm9HcmlkRGF0YS53aWR0aEhpbnQ9MjAwOw0KCQl0YXJnZXRQcm9qZWN0Q29tYm8uc2V0TGF5b3V0RGF0YSh0YXJnZXRDb21ib0dyaWREYXRhKTsNCgkNCgkJdGFyZ2V0UHJvamVjdENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KCQkJCWludCB0YXJnZXRpbmRleD10YXJnZXRQcm9qZWN0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsNCgkJCQlDRE9SZXNvdXJjZU5vZGUgc2VsZWN0ZWRUYXJnZXQ9cHJvamVjdHMuZ2V0KHRhcmdldGluZGV4KTsNCgkJCQl0cnkgewkNCgkJCQkJcmVzb3VyY2VBUFRhcmdldD0gdHJhbnNhY3Rpb25DRE8uZ2V0UmVzb3VyY2Uoc2VsZWN0ZWRUYXJnZXQuZ2V0UGF0aCgpKTsNCgkJCQkJYXNzdXJhbmNlUHJvamVjdFRhcmdldD0gKEFzc3VyYW5jZVByb2plY3QpIHJlc291cmNlQVBUYXJnZXQuZ2V0Q29udGVudHMoKS5nZXQoMCk7DQoJCQkJCWlmKHNvdXJjZVByb2plY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpPi0xKXsNCgkJCQkJCXJldXNlQnRuLnNldEVuYWJsZWQodHJ1ZSk7DQoJCQkJCX0NCgkJCQkJCQ0KCQkJCX0gY2F0Y2ggKENET0V4Y2VwdGlvbiBjZG9lKSB7DQoJCQkJCWNkb2UucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJfQ0KCQkJfQ0KCQl9KTsNCgkJDQovLwkJLy8gVGV4dA0KLy8JCXByb2plY3R0YXJnZXRUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlU291cmNlUHJvamVjdCwgU1dULk5PTkUpOw0KCQlHcmlkRGF0YSBuYW1lVGV4dEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7DQoJCW5hbWVUZXh0R3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQoJCW5hbWVUZXh0R3JpZERhdGEubWluaW11bVdpZHRoID0gNTA7DQoJCW5hbWVUZXh0R3JpZERhdGEud2lkdGhIaW50PTEwMDsNCgkJbmFtZVRleHRHcmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7DQoJCW5hbWVUZXh0R3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkNCgkJLy8gTGFiZWwNCgkJc291cmNlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlU291cmNlUHJvamVjdCwgU1dULk5PTkUpOw0KCQlzb3VyY2VMYWJlbC5zZXRUZXh0KCJTb3VyY2UgUHJvamVjdDoiKTsNCgkJR3JpZERhdGEgc291cmNlTGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KCQlzb3VyY2VMYWJlbEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJc291cmNlTGFiZWxHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQlzb3VyY2VMYWJlbC5zZXRMYXlvdXREYXRhKHNvdXJjZUxhYmVsR3JpZERhdGEpOw0KCQlzb3VyY2VQcm9qZWN0Q29tYm89bmV3IENvbWJvKGNvbXBvc2l0ZVNvdXJjZVByb2plY3QsU1dULk5PTkUpOwkNCgkJDQoJCUdyaWREYXRhIHNvdXJjZUNvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsJCQ0KCQlzb3VyY2VDb21ib0dyaWREYXRhLndpZHRoSGludD0yMDA7DQoJCXNvdXJjZVByb2plY3RDb21iby5zZXRMYXlvdXREYXRhKHNvdXJjZUNvbWJvR3JpZERhdGEpOw0KCQkNCgkJc291cmNlUHJvamVjdENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KCQkJCXNvdXJjZVByb2plY3RDaGFuZ2VkKCk7DQoJCQl9DQoJCQkNCgkJfSk7DQoJCQ0KCQkvL0xvYWQgdGhlIGJhc2VsaW5lDQoJCUdyaWREYXRhIG1vZGVsVmlld2VyR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsNCgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQltb2RlbFZpZXdlckdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS53aWR0aEhpbnQgPSAyMDA7DQoJCW1vZGVsVmlld2VyR3JpZERhdGEuaG9yaXpvbnRhbFNwYW49MjsNCgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7DQoJCQ0KCQljaGVja3RyZWVCYXNlbGluZVNvdXJjZSA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoY29tcG9zaXRlU291cmNlUHJvamVjdCwNCgkJCQlTV1QuTk9ORSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQkNCgkJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuZ2V0VHJlZSgpLnNldExheW91dERhdGEobW9kZWxWaWV3ZXJHcmlkRGF0YSk7DQoJCWNoZWNrdHJlZUJhc2VsaW5lU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoDQoJCQkJYWRhcHRlckZhY3RvcnkpKTsNCgkJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2Uuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKA0KCQkJCWFkYXB0ZXJGYWN0b3J5KSk7DQoNCgkJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsNCg0KCQkJQE92ZXJyaWRlDQoJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7DQoJCQkJT2JqZWN0IG9iaj0oKFRyZWVTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOw0KCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENET1Jlc291cmNlKXsNCgkJCQkJVVJJIHVyaT0oKENET1Jlc291cmNlKW9iaikuZ2V0VVJJKCk7DQoJCQkJCVN0cmluZyBlZGl0b3JJRCA9IGJhc2VsaW5lRWRpdG9ySUQ7DQoJCQkgICAgICAgIA0KCQkJICAgICAgICAgIGlmIChlZGl0b3JJRCAhPSBudWxsICYmICFlZGl0b3JJRC5lcXVhbHMoIiIpKQ0KCQkJICAgICAgICAgIHsNCgkJCSAgICAgICAgICAgIHRyeQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBEYXduRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRGF3bkVkaXRvcklucHV0KHVyaSk7DQoJCQkgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQoJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwkJICAgICAgICAgICAgICANCgkJCSAgICAgICAgICAgICAgQmFzZWxpbmVFZGl0b3IgYmFzZWxpbmVFZGl0b3IgPSAoQmFzZWxpbmVFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkgICAgICAgICAgICAgIGJvb2xlYW4gcmVzZXRDaGVja3MgPSBmYWxzZTsNCgkJCSAgICAgICAgICAgICAgaWYgKGJhc2VsaW5lRWRpdG9yPT1udWxsKSB7DQoJCQkgICAgICAgICAgICAJICByZXNldENoZWNrcyA9dHJ1ZTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIGVkaXRvcklEKTsNCgkJCSAgICAgICAgICAgICAgYmFzZWxpbmVFZGl0b3IgPSAoQmFzZWxpbmVFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkJCQkgIGJhc2VsaW5lRWRpdG9yLnNldEFjdGl2ZVBhZ2VQdWJsaWMoNSk7DQoJCQkJCQkgIGJvb2xlYW4gc3RhdHVzID0gY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuZ2V0Q2hlY2tlZChvYmopOw0KCQkJCQkJICBpZiAocmVzZXRDaGVja3M9PXRydWUpIHsNCgkJCQkJCQkgICBiYXNlbGluZUVkaXRvci5zZXRUcmVlVmlld2VyV2l0aENoZWNrKHN0YXR1cyk7DQoJCQkgICAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgIH0NCgkJCQkJLy9TdHJpbmcgdGV4dD1pLmdldFRleHQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0pOwkJDQoNCgkJLy8gVHJlZVZpZXdlciBmb3IgQXJ0ZWZhY3QgbW9kZWxzDQoJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlID0gbmV3IENoZWNrYm94VHJlZVZpZXdlckV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuU0lOR0xFDQoJCQkJfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCgkJCQkNCgkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0VHJlZSgpLnNldExheW91dERhdGEobW9kZWxWaWV3ZXJHcmlkRGF0YSk7DQoJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCgkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2Uuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQoJDQovLwkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0VHJlZSgpLnNldEVuYWJsZWQoZmFsc2UpOw0KDQoJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCl7DQoNCgkJCUBPdmVycmlkZQ0KCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgew0KCQkJCU9iamVjdCBvYmo9KChUcmVlU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsNCgkJCQlpZihvYmogaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSl7DQoJCQkJCVVSSSB1cmk9KChDRE9SZXNvdXJjZSlvYmopLmdldFVSSSgpOw0KCQkJCQlTdHJpbmcgZWRpdG9ySUQgPSBldmlFZGl0b3JJRDsNCgkJCSAgICAgICAgDQoJCQkgICAgICAgICAgaWYgKGVkaXRvcklEICE9IG51bGwgJiYgIWVkaXRvcklELmVxdWFscygiIikpDQoJCQkgICAgICAgICAgew0KCQkJICAgICAgICAgICAgdHJ5DQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIERhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCSAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkgICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgICBFdmlkZW5jZUVkaXRvciBldmlFZGl0b3IgPSAoRXZpZGVuY2VFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkgICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgICBib29sZWFuIHJlc2V0Q2hlY2tzID0gZmFsc2U7DQoJCQkgICAgICAgICAgICAgIGlmIChldmlFZGl0b3I9PW51bGwpIHsNCgkJCSAgICAgICAgICAgIAkgIHJlc2V0Q2hlY2tzID10cnVlOw0KCQkJICAgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9ySUQpOw0KCQkJICAgICAgICAgICAgICBldmlFZGl0b3IgPSAoRXZpZGVuY2VFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkJCQkgIGV2aUVkaXRvci5zZXRBY3RpdmVQYWdlUHVibGljKDUpOw0KCQkJCQkJICBib29sZWFuIHN0YXR1cyA9IGNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmdldENoZWNrZWQob2JqKTsNCgkJCQkJCSAgaWYgKHJlc2V0Q2hlY2tzPT10cnVlKSB7DQoJCQkJCQkJICAgZXZpRWRpdG9yLnNldFRyZWVWaWV3ZXJXaXRoQ2hlY2soc3RhdHVzKTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJCQkJICBldmlFZGl0b3Iuc2V0QmFzZWxpbmVSZXNvdXJjZShiYXNlbGluZVJlc291cmNlKTsNCgkJCSAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgIH0NCgkJCQkJLy9TdHJpbmcgdGV4dD1pLmdldFRleHQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0pOw0KDQoJCS8vIFRyZWVWaWV3ZXIgZm9yIEFyZ3VtZW50YXRpb24gbW9kZWxzDQoJCWNoZWNrdHJlZUFyZ1NvdXJjZSA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXJFeHQoY29tcG9zaXRlU291cmNlUHJvamVjdCwgU1dULlNJTkdMRQ0KCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7DQoJCQkJDQoJCWNoZWNrdHJlZUFyZ1NvdXJjZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShtb2RlbFZpZXdlckdyaWREYXRhKTsNCgkJY2hlY2t0cmVlQXJnU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCgkJY2hlY2t0cmVlQXJnU291cmNlLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KCQkNCgkJY2hlY2t0cmVlQXJnU291cmNlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCl7DQoNCgkJCUBPdmVycmlkZQ0KCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgew0KCQkJCU9iamVjdCBvYmo9KChUcmVlU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsNCgkJCQlpZihvYmogaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSl7DQoJCQkJCVVSSSB1cmk9KChDRE9SZXNvdXJjZSlvYmopLmdldFVSSSgpOw0KCQkJCQlTdHJpbmcgZWRpdG9ySUQgPSBhcmdFZGl0b3JJRDsNCgkJCSAgICAgICAgDQoJCQkgICAgICAgICAgaWYgKGVkaXRvcklEICE9IG51bGwgJiYgIWVkaXRvcklELmVxdWFscygiIikpDQoJCQkgICAgICAgICAgew0KCQkJICAgICAgICAgICAgdHJ5DQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIERhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCSAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkgICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgICBBcmdFZGl0b3IgYXJnRWRpdG9yID0gKEFyZ0VkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCSAgICAgICAgICAgICAgYm9vbGVhbiByZXNldENoZWNrcyA9IGZhbHNlOw0KCQkJICAgICAgICAgICAgICBpZiAoYXJnRWRpdG9yPT1udWxsKSB7DQoJCQkgICAgICAgICAgICAJICByZXNldENoZWNrcyA9dHJ1ZTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIGVkaXRvcklEKTsNCgkJCSAgICAgICAgICAgICAgYXJnRWRpdG9yID0gKEFyZ0VkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCQkJCSAgYXJnRWRpdG9yLnNldEFjdGl2ZVBhZ2VQdWJsaWMoNSk7DQoJCQkJCQkgIA0KCQkJCQkJICBib29sZWFuIHN0YXR1cyA9IGNoZWNrdHJlZUFyZ1NvdXJjZS5nZXRDaGVja2VkKG9iaik7DQoJCQkJCQkgIGlmIChyZXNldENoZWNrcz09dHJ1ZSkgew0KCQkJCQkJCSAgIGFyZ0VkaXRvci5zZXRUcmVlVmlld2VyV2l0aENoZWNrKHN0YXR1cyk7DQoJCQkgICAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgIH0NCgkJCQkJLy9TdHJpbmcgdGV4dD1pLmdldFRleHQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0pOw0KCQkJCQ0KCQkvLyBUcmVlVmlld2VyIGZvciBQcm9jZXNzIG1vZGVscw0KCQljaGVja3RyZWVQcm9jZXNzU291cmNlID0gbmV3IENoZWNrYm94VHJlZVZpZXdlckV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuU0lOR0xFDQoJCQkJfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCgkJCQkNCgkJY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShtb2RlbFZpZXdlckdyaWREYXRhKTsNCgkJY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQoJCWNoZWNrdHJlZVByb2Nlc3NTb3VyY2Uuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQoJCQ0KCQljaGVja3RyZWVQcm9jZXNzU291cmNlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCl7DQoNCgkJCUBPdmVycmlkZQ0KCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgew0KCQkJCU9iamVjdCBvYmo9KChUcmVlU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsNCgkJCQlpZihvYmogaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSl7DQoJCQkJCVVSSSB1cmk9KChDRE9SZXNvdXJjZSlvYmopLmdldFVSSSgpOw0KCQkJCQlTdHJpbmcgZWRpdG9ySUQgPSBwcm9jZXNzRWRpdG9ySUQ7DQoJCQkgICAgICAgIA0KCQkJICAgICAgICAgIGlmIChlZGl0b3JJRCAhPSBudWxsICYmICFlZGl0b3JJRC5lcXVhbHMoIiIpKQ0KCQkJICAgICAgICAgIHsNCgkJCSAgICAgICAgICAgIHRyeQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBEYXduRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRGF3bkVkaXRvcklucHV0KHVyaSk7DQoJCQkgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQoJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwkJICAgICAgICAgICAgICANCgkJCSAgICAgICAgICAgICAgUHJvY2Vzc0VkaXRvciBwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkgICAgICAgICAgICAgIGJvb2xlYW4gcmVzZXRDaGVja3MgPSBmYWxzZTsNCgkJCSAgICAgICAgICAgICAgaWYgKHByb2Nlc3NFZGl0b3I9PW51bGwpIHsNCgkJCSAgICAgICAgICAgIAkgIHJlc2V0Q2hlY2tzID10cnVlOw0KCQkJICAgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9ySUQpOw0KCQkJICAgICAgICAgICAgICBwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJCQkJCQkgIHByb2Nlc3NFZGl0b3Iuc2V0QWN0aXZlUGFnZVB1YmxpYyg1KTsNCgkJCQkJCSAgYm9vbGVhbiBzdGF0dXMgPSBjaGVja3RyZWVQcm9jZXNzU291cmNlLmdldENoZWNrZWQob2JqKTsNCgkJCQkJCSAgaWYgKHJlc2V0Q2hlY2tzPT10cnVlKSB7DQoJCQkJCQkJICAgcHJvY2Vzc0VkaXRvci5zZXRUcmVlVmlld2VyV2l0aENoZWNrKHN0YXR1cyk7DQoJCQkgICAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQ0KCQkJICAgICAgICAgICAgew0KCQkJICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgIH0NCgkJCQkJLy9TdHJpbmcgdGV4dD1pLmdldFRleHQoKTsNCgkJCQl9DQoJCQkJDQoJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KCQkJCQ0KCQkJfQ0KCQkJDQoJCX0pOw0KCQkJCQkJDQoJCQ0KCQkvL2NoZWNrdHJlZVByb2Nlc3NTb3VyY2UuZ2V0VHJlZSgpLnNldEVuYWJsZWQoZmFsc2UpOyAvL0h1YXNjYXIgdG8gZW5hYmxlIGFsbCB0aGUgbGlzdHMNCg0KCQlyZXVzZUJ0biA9IG5ldyBCdXR0b24gKHNvdXJjZUNvbXBvc2l0ZSwgU1dULlBVU0gpOw0KCSAgICByZXVzZUJ0bi5zZXRUZXh0KCJSZXVzZSIpOw0KCSAgICByZXVzZUJ0bi5zZXRFbmFibGVkKGZhbHNlKTsNCgkgICAgDQoJCUdyaWREYXRhIG9rR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsJCQ0KCQlva0dyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuUklHSFQ7DQoJCXJldXNlQnRuLnNldExheW91dERhdGEob2tHcmlkRGF0YSk7DQoJCQ0KCSAgICByZXVzZUJ0bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCgkJCQlleGVjdXRlUmV1c2UoKTsNCgkJCX0NCgkgICAgfSk7CQ0KCSAgICANCgkJc2V0UHJvamVjdERhdGFUb0NvbWJvKCk7DQoJICAgIA0KCX0NCglwdWJsaWMgdm9pZCBDcmVhdGVNb2RlbEZyb21SZXNvdXJjZVNldChUcmVlVmlld2VyIHRyZWUsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7DQoNCgkJdHJ5IHsNCgkJCXRyZWUuc2V0SW5wdXQocmVzb3VyY2VTZXQpOw0KCQkJDQoJCQlmaW5hbCBWaWV3ZXJGaWx0ZXIgbW9kZWxGaWx0ZXIgPSBuZXcgVmlld2VyRmlsdGVyKCkgew0KCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwNCgkJCQkJCU9iamVjdCBlbGVtZW50KSB7DQoJCQkJCQ0KCQkJCQkvL2lmIChzRWxlbWVudEZpbHRlci5jb250ZW50RXF1YWxzKCJBcnRlZmFjdCIpKSB7DQoJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENET1Jlc291cmNlKSB7DQoJCQkJCQkJcmV0dXJuIHRydWU7CQkJCQkJDQoJCQkJCQl9DQovLwkJCQkJCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZU5vZGUpIHsNCi8vCQkJCQkJCXJldHVybiB0cnVlOwkJCQkJCQ0KLy8JCQkJCQl9DQoJCQkJCQllbHNlIHsNCgkJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCQl9DQoJCQkJCQkJDQoJCQkJCS8vfSBlbHNlDQoJCQkJCS8vCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9Ow0KCQkJdHJlZS5hZGRGaWx0ZXIobW9kZWxGaWx0ZXIpOw0KCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCgkJCU1lc3NhZ2VEaWFsb2cNCgkJCQkJLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIk5vdCB2YWxpZCBtb2RlbCBmaWxlIiwNCgkJCQkJCQkiVGhlIHByb3ZpZGVkIG1vZGVsIGZpbGUgY291bGRuJ3QgYmUgcGFyc2VkIGFzIGFuIEVNRiByZXNvdXJjZSIpOw0KCQkJdHJlZS5zZXRJbnB1dChudWxsKTsNCgkJfQ0KCX0NCglwcml2YXRlIGJvb2xlYW4gY29weU1hcHMoKSB7DQoJCVN0cmluZyBzb3VyY2VQYXRoPSByZXNvdXJjZUFQU291cmNlLmdldFBhdGgoKTsNCgkJU3RyaW5nIFtdIHBhdGhQYXJ0cz0gc291cmNlUGF0aC5zcGxpdCgiLyIpOw0KCQlTdHJpbmcgcHJvamVjdEZvbGRlcj1wYXRoUGFydHNbMV0rICIvIiArIHBhdGhQYXJ0c1syXSA7DQoJCQ0KCQlDRE9SZXNvdXJjZUZvbGRlciBmb2xkZXIgPSB0cmFuc2FjdGlvbkNETy5nZXRSZXNvdXJjZUZvbGRlcihwcm9qZWN0Rm9sZGVyKTsNCgkJRUxpc3QgPENET1Jlc291cmNlTm9kZT4gY29udGVudHM9bnVsbDsNCgkJaWYoZm9sZGVyIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VGb2xkZXIpew0KCQkJY29udGVudHM9ICgoQ0RPUmVzb3VyY2VGb2xkZXIpZm9sZGVyKS5nZXROb2RlcygpOwkJCQ0KCQl9DQoJCQ0KCQlmb3IoaW50IHg9MDt4PGNvbnRlbnRzLnNpemUoKTt4Kyspew0KCQkJQ0RPUmVzb3VyY2VOb2RlIG9uZU5vZGUgID0gY29udGVudHMuZ2V0KHgpOw0KCQkJaWYob25lTm9kZSBpbnN0YW5jZW9mIENET1Jlc291cmNlKXsNCgkJCQlpZihvbmVOb2RlLmdldE5hbWUoKS5lbmRzV2l0aCgibWFwcGluZyIpKXsNCgkJCQkJQ0RPUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgID0gKENET1Jlc291cmNlKW9uZU5vZGU7DQoJCQkJCVN0cmluZyBwcm9qZWN0UGF0aD0gcmVzb3VyY2VBUFRhcmdldC5nZXRQYXRoKCk7DQoJCQkJCXBhdGhQYXJ0cz0gcHJvamVjdFBhdGguc3BsaXQoIkFTU1VSQU5DRV9QUk9KRUNUIik7DQoJCQkJCVN0cmluZyB0YXJnZXRQYXRoPXBhdGhQYXJ0c1swXSsgIkFTU1VSQU5DRV9QUk9KRUNULyIgKyBvbmVOb2RlLmdldE5hbWUoKTsNCgkJCQkJDQoJCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCQkJCUNET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IHRyYW5zYWN0aW9uQ0RPLmNyZWF0ZVJlc291cmNlKHRhcmdldFBhdGgpOw0KCQkJCQkNCgkJCQkJaW5pdENvcHkoc291cmNlUmVzb3VyY2UsIHRhcmdldFJlc291cmNlLCBudWxsKTsNCg0KCQkJCQl0cnkgewkJCQkNCgkJCQkJCXRhcmdldFJlc291cmNlLnNhdmUob3B0aW9ucyk7CQkJCQkJDQoJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQoJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIk1hcHBpbmcgcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0KDQoJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCQkJCQkNCgkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJCQl0cmFuc2FjdGlvbkNETy5yb2xsYmFjaygpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQ0KCQ0KCXByaXZhdGUgYm9vbGVhbiBjb3B5QmFzZWxpbmVzKEJhc2VsaW5lQ29uZmlnIGJjb25maWdBY3RpdmUpIHsNCgkJQXJyYXlMaXN0PE9iamVjdD4gYWxsT2JqZWN0cyA9bnVsbDsNCgkJDQoJCWJvb2xlYW4gaXNNb2RlbENoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCQ0KCQlmb3IgKCBFT2JqZWN0IGtleSA6IGJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJQ0RPUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgID0gKENET1Jlc291cmNlKWtleTsNCgkJCWJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgbnVsbCk7DQoJCQlpc01vZGVsQ2hlY2tlZCA9IGNoZWNrdHJlZUJhc2VsaW5lU291cmNlLmdldENoZWNrZWQoa2V5KTsNCgkJCWlmIChpc01vZGVsQ2hlY2tlZCkgew0KCQkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCB0cmVlVmlldyA9IG51bGw7DQoJCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbnVsbDsNCgkJCQkNCgkJCQlVUkkgdXJpPXNvdXJjZVJlc291cmNlLmdldFVSSSgpOw0KCQkJCURhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCgkJCQlCYXNlbGluZUVkaXRvciBlZGl0b3IgPSAoQmFzZWxpbmVFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7DQoJICAgICAgICAgICAgCXRyZWVWaWV3ID0gZWRpdG9yLmdldFRyZWVWaWV3ZXJXaXRoQ2hlY2soKTsNCgkgICAgICAgICAgICB9DQoJCQkJDQoJCQkJaWYgKHRyZWVWaWV3IT1udWxsKSB7DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IHRyZWVWaWV3LmdldENoZWNrZWRFbGVtZW50cygpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWFsbE9iamVjdHM9IG5ldyBBcnJheUxpc3QoKTsNCgkJCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvciA9IHNvdXJjZVJlc291cmNlLmdldEFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCgkJCQkJCUVPYmplY3QgYUVPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7DQoJCQkJCQlhbGxPYmplY3RzLmFkZChhRU9iamVjdCk7DQoJCQkJCX0NCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gYWxsT2JqZWN0cy50b0FycmF5KCk7DQoJCQkJfQ0KCQkJCWJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQlTdHJpbmcgcHJvamVjdFBhdGg9IHJlc291cmNlQVBUYXJnZXQuZ2V0UGF0aCgpOw0KCQkJCVN0cmluZyBbXSBwYXRoUGFydHM9IHByb2plY3RQYXRoLnNwbGl0KCJBU1NVUkFOQ0VfUFJPSkVDVCIpOw0KCQkJCVN0cmluZyB0YXJnZXRQYXRoPXBhdGhQYXJ0c1swXSsgIkFTU1VSQU5DRV9QUk9KRUNULyIgKyBzb3VyY2VSZXNvdXJjZS5nZXROYW1lKCk7DQoJDQoJCQkJdGFyZ2V0UGF0aCA9IGNyZWF0ZU5vdEV4aXN0aW5nTmFtZSh0YXJnZXRQYXRoKTsNCgkJCQkNCgkJCQlDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSB0cmFuc2FjdGlvbkNETy5jcmVhdGVSZXNvdXJjZSh0YXJnZXRQYXRoKTsNCgkJCQkvL2RpYWdyYW1SZXNvdXJjZSAgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKGFzc3VyYW5jZXByb2plY3RGb2xkZXIuZ2V0UGF0aCgpICsgIi8iICsgYmFzZWxpbmVOYW1lICsgIi5iYXNlbGluZV9kaWFncmFtIik7DQoJCQkJLy9UbyBjb3B5IHRoZSByZWZmcmFtZXdvcmsgYXMgYmFzZWxpbmUNCgkJCQkvL01DUENET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IGFzc3VyYW5jZXByb2plY3RGb2xkZXIuYWRkUmVzb3VyY2UoYmFzZWxpbmVOYW1lICsgIi5iYXNlbGluZSIpOw0KCQ0KCQkJCWluaXRDb3B5KHNvdXJjZVJlc291cmNlLCB0YXJnZXRSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkNCgkJCQl0cnkgewkJCQkNCgkJCQkJdGFyZ2V0UmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCgkJCQkJDQoJCQkJCWJjb25maWdBY3RpdmUuZ2V0UmVmRnJhbWV3b3JrKCkuYWRkKChCYXNlRnJhbWV3b3JrKSB0YXJnZXRSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7DQoJCQkJCQ0KCQkJCQlyZXNvdXJjZUFQVGFyZ2V0LnNhdmUob3B0aW9ucyk7CQkJCQ0KCQ0KCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobmV3IFNoZWxsKCksICJCYXNlbGluZSByZXVzZSBmYWlsZWQiLCAiRXJyb3IgY29weWluZyBtb2RlbCAiICsgdGFyZ2V0UGF0aCk7DQoJDQoJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sJCQkJCQ0KCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCQl0cmFuc2FjdGlvbkNETy5yb2xsYmFjaygpOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiB0cnVlOw0KCX0NCgkNCglwcml2YXRlIGJvb2xlYW4gY29weUV2aWRlbmNlcygpIHsNCgkJQXJyYXlMaXN0PE9iamVjdD4gYWxsT2JqZWN0cyA9bnVsbDsNCgkJDQoJCWJvb2xlYW4gaXNNb2RlbENoZWNrZWQgPSBmYWxzZTsNCg0KCQlmb3IgKCBFT2JqZWN0IGtleSA6IGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJQ0RPUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgID0gKENET1Jlc291cmNlKWtleTsNCgkJCWV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgbnVsbCk7DQoJCQlpc01vZGVsQ2hlY2tlZCA9IGNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmdldENoZWNrZWQoa2V5KTsNCgkJCWlmIChpc01vZGVsQ2hlY2tlZCkgew0KCQkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCB0cmVlVmlldyA9IG51bGw7DQoJCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbnVsbDsNCgkJCQkNCgkJCQlVUkkgdXJpPXNvdXJjZVJlc291cmNlLmdldFVSSSgpOw0KCQkJCURhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCgkJCQlFdmlkZW5jZUVkaXRvciBlZGl0b3IgPSAoRXZpZGVuY2VFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7DQoJICAgICAgICAgICAgCXRyZWVWaWV3ID0gZWRpdG9yLmdldFRyZWVWaWV3ZXJXaXRoQ2hlY2soKTsJICAgICAgICAgICAgCQkgICAgICAgICAgICAJDQoJICAgICAgICAgICAgfQ0KCQkJCQ0KCQkJCWlmICh0cmVlVmlldyE9bnVsbCkgew0KCQkJCQlzZWxlY3RlZE9iamVjdHMgPSB0cmVlVmlldy5nZXRDaGVja2VkRWxlbWVudHMoKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlhbGxPYmplY3RzPSBuZXcgQXJyYXlMaXN0KCk7DQoJCQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3IgPSBzb3VyY2VSZXNvdXJjZS5nZXRBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQoJCQkJCQlFT2JqZWN0IGFFT2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOw0KCQkJCQkJYWxsT2JqZWN0cy5hZGQoYUVPYmplY3QpOw0KCQkJCQl9DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IGFsbE9iamVjdHMudG9BcnJheSgpOw0KCQkJCX0NCgkJCQlldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5wdXQoc291cmNlUmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7DQoJCQkJU3RyaW5nIHByb2plY3RQYXRoPSByZXNvdXJjZUFQVGFyZ2V0LmdldFBhdGgoKTsNCgkJCQlTdHJpbmcgW10gcGF0aFBhcnRzPSBwcm9qZWN0UGF0aC5zcGxpdCgiQVNTVVJBTkNFX1BST0pFQ1QiKTsNCgkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMF0rICJFVklERU5DRS8iICsgc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpOw0KCQkJCQkJCQkNCgkJCQl0YXJnZXRQYXRoID0gY3JlYXRlTm90RXhpc3RpbmdOYW1lKHRhcmdldFBhdGgpOw0KCQkJCUNET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IHRyYW5zYWN0aW9uQ0RPLmNyZWF0ZVJlc291cmNlKHRhcmdldFBhdGgpOw0KCQkJCQ0KCQkJCS8vZGlhZ3JhbVJlc291cmNlICA9IHRyYW5zYWN0aW9uLmdldE9yQ3JlYXRlUmVzb3VyY2UoYXNzdXJhbmNlcHJvamVjdEZvbGRlci5nZXRQYXRoKCkgKyAiLyIgKyBiYXNlbGluZU5hbWUgKyAiLmJhc2VsaW5lX2RpYWdyYW0iKTsNCgkJCQkvL1RvIGNvcHkgdGhlIHJlZmZyYW1ld29yayBhcyBiYXNlbGluZQ0KCQkJCS8vTUNQQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gYXNzdXJhbmNlcHJvamVjdEZvbGRlci5hZGRSZXNvdXJjZShiYXNlbGluZU5hbWUgKyAiLmJhc2VsaW5lIik7DQoNCgkJCQlpbml0Q29weShzb3VyY2VSZXNvdXJjZSwgdGFyZ2V0UmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7DQoNCgkJCQl0cnkgewkJDQoJCQkJCQ0KCQkJCQl0YXJnZXRSZXNvdXJjZS5zYXZlKG9wdGlvbnMpOw0KCQkJCQl0YXJnZXRBc3NldHNQYWNrYWdlLmdldEFydGVmYWN0c01vZGVsKCkuYWRkKChBcnRlZmFjdE1vZGVsKSB0YXJnZXRSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7DQoJCQkJCXJlc291cmNlQVBUYXJnZXQuc2F2ZShvcHRpb25zKTsNCgkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiRXZpZGVuY2UgcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0KDQoJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sJCQkJCQ0KCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCQl0cmFuc2FjdGlvbkNETy5yb2xsYmFjaygpOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KDQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQ0KCQkJDQoJCQkJCQkNCglwcml2YXRlIFN0cmluZyBjcmVhdGVOb3RFeGlzdGluZ05hbWUoU3RyaW5nIHRhcmdldFBhdGgpIHsNCgkJDQoJCWlmKHRyYW5zYWN0aW9uQ0RPLmhhc1Jlc291cmNlKHRhcmdldFBhdGgpKXsNCgkJCVN0cmluZyBbXSB0b2tlbnM9IHRhcmdldFBhdGguc3BsaXQoIi8iKTsNCgkJCQ0KCQkJU3RyaW5nIFtdIG5hbWVUb2tlcyA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoLTFdLnNwbGl0KCJcXC4iKTsJCQkNCgkJCS8vQ2hhbmdlIG9ubHkgdGhlIG5hbWUNCgkJCVN0cmluZyBtb2RlbE5hbWUgPSBuYW1lVG9rZXNbMF07DQoJCQlTdHJpbmcgbW9kZWxUeXBlID0gbmFtZVRva2VzWzFdOw0KCQkJY2hhciBsYXN0Y2hhciA9IG1vZGVsTmFtZS5jaGFyQXQobW9kZWxOYW1lLmxlbmd0aCgpLTEpOw0KCQkJY2hhciBwcmV2bGFzdGNoYXIgPSBtb2RlbE5hbWUuY2hhckF0KG1vZGVsTmFtZS5sZW5ndGgoKS0yKTsNCgkJCQ0KCQkJaWYoQ2hhcmFjdGVyLmlzRGlnaXQocHJldmxhc3RjaGFyKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdChsYXN0Y2hhcikpew0KCQkJCWludCBudW1iZXI9IEludGVnZXIucGFyc2VJbnQoIiIgKyBwcmV2bGFzdGNoYXIgKyBsYXN0Y2hhcik7DQoJCQkJbnVtYmVyKys7DQoJCQkJbW9kZWxOYW1lPW1vZGVsTmFtZS5zdWJzdHJpbmcoMCwgbW9kZWxOYW1lLmxlbmd0aCgpLTIpICsgbnVtYmVyOw0KCQkJfQ0KCQkJZWxzZSBpZihDaGFyYWN0ZXIuaXNEaWdpdChsYXN0Y2hhcikpew0KCQkJCWludCBudW1iZXI9IEludGVnZXIucGFyc2VJbnQoIiIgKyBsYXN0Y2hhcik7DQoJCQkJbnVtYmVyKys7DQoJCQkJbW9kZWxOYW1lPW1vZGVsTmFtZS5zdWJzdHJpbmcoMCwgbW9kZWxOYW1lLmxlbmd0aCgpLTEpICsgbnVtYmVyOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQltb2RlbE5hbWU9bW9kZWxOYW1lICsgIjEiOw0KCQkJfQ0KCQkJdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGguc3Vic3RyaW5nKDAsdGFyZ2V0UGF0aC5sYXN0SW5kZXhPZigiLyIpKSArICIvIiArIG1vZGVsTmFtZSArICIuIiArIG1vZGVsVHlwZTsNCgkJCQ0KCQkJLy9DaGVjayBhZ2FpbiB0aGUgbmV3IG5hbWUNCgkJCXRhcmdldFBhdGg9Y3JlYXRlTm90RXhpc3RpbmdOYW1lKHRhcmdldFBhdGgpOw0KCQl9DQoJCXJldHVybiB0YXJnZXRQYXRoOw0KCX0NCg0KCS8vIE1DUCBDcm9zc1Byb2plY3QNCglwcml2YXRlIExpc3Q8Q0RPUmVzb3VyY2U+IGdldERpYWdyYW1zRnJvbU1vZGVsKENET1Jlc291cmNlIG1vZGVsQ0RPKSB7DQoJCUxpc3Q8Q0RPUmVzb3VyY2U+IHJlcyA9IG5ldyBBcnJheUxpc3Q8Q0RPUmVzb3VyY2U+KCk7DQoJCQ0KCQkvKiBObyBmdW5jaW9uYSBwb3JxdWUgbG9zIGRpYWdyYW1hcyBubyBlc3ThbiBjYXJnYWRvcyBlbiBtZW1vcmlhIG8gZXMgcXVlIHPzbG8gZnVuY2lvbmEgY29uIG1vZGVsb3MNCgkJRU9iamVjdCBhRU9iamVjdD0gbW9kZWxDRE8uZ2V0Q29udGVudHMoKS5nZXQoMCk7DQoJCUxpc3Q8Q0RPT2JqZWN0UmVmZXJlbmNlPiByYyA9IHRyYW5zYWN0aW9uLnF1ZXJ5WFJlZnMoQ0RPVXRpbC5nZXRDRE9PYmplY3QoYUVPYmplY3QpLCBuZXcgRVJlZmVyZW5jZVtdIHt9KTsNCgkJZm9yKENET09iamVjdFJlZmVyZW5jZSBvbmVSZWY6cmMpew0KCQkJaWYgKG9uZVJlZi5nZXRTb3VyY2VPYmplY3QoKS5lUmVzb3VyY2UoKSAhPSBtb2RlbENETykgcmVzLmFkZCgoQ0RPUmVzb3VyY2UpKG9uZVJlZi5nZXRTb3VyY2VPYmplY3QoKS5lUmVzb3VyY2UoKSkpOw0KCQkJaWYgKG9uZVJlZi5nZXRUYXJnZXRPYmplY3QoKS5lUmVzb3VyY2UoKSAhPSBtb2RlbENETykgcmVzLmFkZCgoQ0RPUmVzb3VyY2UpKG9uZVJlZi5nZXRUYXJnZXRPYmplY3QoKS5lUmVzb3VyY2UoKSkpOw0KCQl9DQoJCUxpc3Q8RU9iamVjdD4gbGlzdCA9IGFFT2JqZWN0LmVDcm9zc1JlZmVyZW5jZXMoKTsNCgkJZm9yKEVPYmplY3QgZWxlbSA6IGxpc3QpDQoJCXsNCgkJCXJlcy5hZGQoKENET1Jlc291cmNlKWVsZW0uZVJlc291cmNlKCkpOw0KCQl9DQoJCSovDQoJCVN0cmluZyB0ZW1wID0gbW9kZWxDRE8uZ2V0UGF0aCgpOw0KCQlTdHJpbmcgc291cmNlRm9sZGVyUGF0aCA9IHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGFzdEluZGV4T2YoIi8iKSk7DQoJCUNET1Jlc291cmNlRm9sZGVyIGFyZ0ZvbGRlcj10cmFuc2FjdGlvbkNETy5nZXRSZXNvdXJjZUZvbGRlcihzb3VyY2VGb2xkZXJQYXRoKTsNCgkJRUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPiBsaXN0TiA9IGFyZ0ZvbGRlci5nZXROb2RlcygpOw0KCQlmb3IgKCBDRE9SZXNvdXJjZU5vZGUgbm9kZSA6IGxpc3ROKSB7DQoJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENET1Jlc291cmNlRm9sZGVyKSB7DQoJCQkJU3lzdGVtLm91dC5wcmludGxuKCJnZXREaWFncmFtc0Zyb21Nb2RlbDogZm91bmQgc3ViZm9sZGVyID0uIisgbm9kZS50b1N0cmluZygpKTsNCgkJCQlMaXN0PENET1Jlc291cmNlPiByZXMyID0gZ2V0RGlhZ3JhbXNGcm9tTW9kZWwoKENET1Jlc291cmNlKSBub2RlKTsNCgkJCQlyZXMuYWRkQWxsKHJlczIpOw0KCQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2UpIHsJCQkJCQ0KCQkJCUNET1Jlc291cmNlIGVsZW0gPSAoQ0RPUmVzb3VyY2Upbm9kZTsNCgkJCQlpZihlbGVtLmdldFBhdGgoKS5jb250YWlucyhFWFRFTlNJT05fRElBR1JBTSkpew0KCQkJCQlFT2JqZWN0IG1vZGVsID0gKEVPYmplY3QpICgoRGlhZ3JhbUltcGwpZWxlbS5nZXRDb250ZW50cygpLmdldCgwKSkuYmFzaWNHZXRFbGVtZW50KCk7DQoJCQkJCS8vaWYgKGVsZW0uZ2V0Q29udGVudHMoKS5nZXQoMCkuZVJlc291cmNlKCkgPT0gbW9kZWxDRE8pDQoJCQkJCWlmIChtb2RlbC5lUmVzb3VyY2UoKS5nZXRVUkkoKSA9PSBtb2RlbENETy5nZXRVUkkoKSkNCgkJCQkJew0KCQkJCQkJcmVzLmFkZCgoQ0RPUmVzb3VyY2UpZWxlbS5nZXRDb250ZW50cygpLmdldCgwKS5lUmVzb3VyY2UoKSk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkvL2xpc3ROLnJlbW92ZSgwKTsgTUUgREEgUFJPQkxFTUFTIFBPUlFVRSBFU1RPWSBCT1JSQU5ETyEhIQ0KCQl9DQoJCQ0KCQlyZXR1cm4gcmVzOw0KCX0NCgkvLyBNQ1AgQ3Jvc3NQcm9qZWN0DQoJDQoJcHJpdmF0ZSBib29sZWFuIGNvcHlBcmd1bWVudGF0aW9ucygpIHsNCgkJQXJyYXlMaXN0PE9iamVjdD4gYWxsT2JqZWN0cyA9bnVsbDsNCgkJDQoJCWJvb2xlYW4gaXNNb2RlbENoZWNrZWQgPSBmYWxzZTsNCgkJLy8gTUNQIENyb3NzUHJvamVjdA0KCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBudWxsOw0KCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhuZXcgU2hlbGwoKSk7DQoJCS8vIE1DUCBDcm9zc1Byb2plY3QNCgkJDQoJCWZvciAoIEVPYmplY3Qga2V5IDogYXJnQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJQ0RPUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgID0gKENET1Jlc291cmNlKWtleTsNCgkJCWFyZ0FsbFNlbGVjdGVkT2JqZWN0cy5wdXQoc291cmNlUmVzb3VyY2UsIG51bGwpOw0KCQkJaXNNb2RlbENoZWNrZWQgPSBjaGVja3RyZWVBcmdTb3VyY2UuZ2V0Q2hlY2tlZChrZXkpOw0KCQkJDQoJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0DQoJCQlkaWFsb2cub3BlbigpOw0KCQkJbW9uaXRvciA9IGRpYWxvZy5nZXRQcm9ncmVzc01vbml0b3IoKTsNCgkJCQlTdHJpbmcgQ1JFQVRFX0FSR19ESUFHUkFNID0gIkNyZWF0ZSBDcm9zcyBBcmcgZGlhZ3JhbSI7DQoJCQkJbW9uaXRvci5iZWdpblRhc2soQ1JFQVRFX0FSR19ESUFHUkFNLCAyMCk7DQoJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0CQ0KCQkJDQoJCQlpZiAoaXNNb2RlbENoZWNrZWQpIHsNCgkJCQlDaGVja2JveFRyZWVWaWV3ZXJFeHQgdHJlZVZpZXcgPSBudWxsOw0KCQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG51bGw7DQoJCQkJDQoJCQkJVVJJIHVyaT1zb3VyY2VSZXNvdXJjZS5nZXRVUkkoKTsNCgkJCQlEYXduRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRGF3bkVkaXRvcklucHV0KHVyaSk7DQoJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQoJCQkJQXJnRWRpdG9yIGVkaXRvciA9IChBcmdFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7DQoJICAgICAgICAgICAgCXRyZWVWaWV3ID0gZWRpdG9yLmdldFRyZWVWaWV3ZXJXaXRoQ2hlY2soKTsNCgkgICAgICAgICAgICB9DQoJCQkJDQoJCQkJaWYgKHRyZWVWaWV3IT1udWxsKSB7DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IHRyZWVWaWV3LmdldENoZWNrZWRFbGVtZW50cygpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWFsbE9iamVjdHM9IG5ldyBBcnJheUxpc3QoKTsNCgkJCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvciA9IHNvdXJjZVJlc291cmNlLmdldEFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCgkJCQkJCUVPYmplY3QgYUVPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7DQoJCQkJCQlhbGxPYmplY3RzLmFkZChhRU9iamVjdCk7DQoJCQkJCX0NCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gYWxsT2JqZWN0cy50b0FycmF5KCk7DQoJCQkJfQ0KCQkJCWFyZ0FsbFNlbGVjdGVkT2JqZWN0cy5wdXQoc291cmNlUmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7DQoJCQkJU3RyaW5nIHByb2plY3RQYXRoPSByZXNvdXJjZUFQVGFyZ2V0LmdldFBhdGgoKTsNCgkJCQkNCgkJCQlTdHJpbmcgW10gcGF0aFBhcnRzPSBwcm9qZWN0UGF0aC5zcGxpdCgiQVNTVVJBTkNFX1BST0pFQ1QiKTsNCgkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMF0rICJBUkdVTUVOVEFUSU9OLyIgKyBzb3VyY2VSZXNvdXJjZS5nZXROYW1lKCk7CQkJCQ0KCQkJCQ0JCQkJU3RyaW5nIHRhcmdldEZvbGRlclBhdGg9cGF0aFBhcnRzWzBdKyAiQVJHVU1FTlRBVElPTiI7DQkJCQl0YXJnZXRQYXRoID0gY3JlYXRlTm90RXhpc3RpbmdOYW1lKHRhcmdldFBhdGgpOw0JCQkJQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gdHJhbnNhY3Rpb25DRE8uY3JlYXRlUmVzb3VyY2UodGFyZ2V0UGF0aCk7DQkJCQkvL2RpYWdyYW1SZXNvdXJjZSAgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKGFzc3VyYW5jZXByb2plY3RGb2xkZXIuZ2V0UGF0aCgpICsgIi8iICsgYmFzZWxpbmVOYW1lICsgIi5iYXNlbGluZV9kaWFncmFtIik7DQkJCQkvL1RvIGNvcHkgdGhlIHJlZmZyYW1ld29yayBhcyBiYXNlbGluZQ0JCQkJLy9NQ1BDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmFkZFJlc291cmNlKGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmUiKTsNDQoJCQkJaW5pdENvcHkoc291cmNlUmVzb3VyY2UsIHRhcmdldFJlc291cmNlLCBzZWxlY3RlZE9iamVjdHMpOw0JCQoJCQkJdHJ5IHsJCQkJDQkJCQkJdGFyZ2V0UmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsNCQkJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0DQkJCQkJLy8gY3JlYXIgbG9zIGRpYWdyYW1hcyBkZWwgbW9kZWxvDQkJCQkJLy9TdHJpbmcgc291cmNlRGlhZ3JhbT0gc291cmNlUmVzb3VyY2UuZ2V0UGF0aCgpICsgIl9kaWFncmFtIjsNCQkJCQkvL0NET1Jlc291cmNlIHNvdXJjZURpYWdyYW1SZXNvdXJjZSAgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKHNvdXJjZURpYWdyYW0pOw0JCQkJCUxpc3Q8Q0RPUmVzb3VyY2U+IGxpc3REaWFncmFtcyA9IGdldERpYWdyYW1zRnJvbU1vZGVsKHNvdXJjZVJlc291cmNlKTsNCQkJCQlmb3IoQ0RPUmVzb3VyY2Ugc291cmNlRGlhZ3JhbVJlc291cmNlOiBsaXN0RGlhZ3JhbXMpDQkJCQkJew0JCQkJCQkvLyBsaXN0YSBkZSBvYmpldG9zIGVuIGRpYWdyYW1hDQkJCQkJCS8vTGlzdDxFT2JqZWN0PiBsaXN0Um9vdE9iamVjdHMgPSBzb3VyY2VEaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKTsNCQkJCQkJTGlzdDxFT2JqZWN0PiBsaXN0Um9vdE9iamVjdHNTb3VyY2UgPSAoKERpYWdyYW0pc291cmNlRGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApKS5nZXRQZXJzaXN0ZWRDaGlsZHJlbigpOw0JCQkJCQlMaXN0PEVPYmplY3Q+IGxpc3RSb290T2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsNCQkJCQkJZm9yKEVPYmplY3QgZWxlbWVudCA6IGxpc3RSb290T2JqZWN0c1NvdXJjZSkNCQkJCQkJew0JCQkJCQkJRU9iamVjdCBvYmpzb3VyY2UgPSAoKFNoYXBlSW1wbCllbGVtZW50KS5nZXRFbGVtZW50KCk7DQkJCQkJCQkvL0VPYmplY3Qgb2JqID0gbWFwLmdldChvYmpzb3VyY2UpOw0JCQkJCSAgICAgICAgQ0RPSUQgY2RvSUQgPSBDRE9VdGlsLmdldENET09iamVjdChvYmpzb3VyY2UpLmNkb0lEKCk7DQkJCQkJCQlFT2JqZWN0IG9iaiA9IGVJRFRvT2JqZWN0TWFwLmdldChjZG9JRC50b1N0cmluZygpKTsNCQkJCQkJCWxpc3RSb290T2JqZWN0cy5hZGQob2JqKTsNCQkJCQkJfQ0JCQkJCQkvLyBjcmVhciBlbCByZWN1cnNvIGRpYWdyYW0gdmFjaW8NCQkJCQkJQ0RPUmVzb3VyY2VGb2xkZXIgYXJnRm9sZGVyPXRyYW5zYWN0aW9uQ0RPLmdldFJlc291cmNlRm9sZGVyKHRhcmdldEZvbGRlclBhdGgpOwkJCQkJCgkJCQkJCS8vQ0RPUmVzb3VyY2VGb2xkZXIgYXJnRm9sZGVyPXByb2plY3RGb2xkZXIuYWRkUmVzb3VyY2VGb2xkZXIoIkFSR1VNRU5UQVRJT04iKTsNCQkJCSAgICAgICAgLy9DRE9SZXNvdXJjZSB0YXJnZXREaWFncmFtUmVzb3VyY2UgID0gdHJhbnNhY3Rpb24uZ2V0T3JDcmVhdGVSZXNvdXJjZSh0YXJnZXRQYXRoICsgRVhURU5TSU9OX0RJQUdSQU0pOw0JCQkJCQlTdHJpbmcgdGFyZ2V0RGlhZ3JhbSA9IHRhcmdldFBhdGguc3Vic3RyaW5nKDAsIHRhcmdldFBhdGgubGFzdEluZGV4T2YoIi8iKSArIDEpICsgc291cmNlRGlhZ3JhbVJlc291cmNlLmdldE5hbWUoKTsNCQkJCQkJdGFyZ2V0RGlhZ3JhbSA9IGNyZWF0ZU5vdEV4aXN0aW5nTmFtZSh0YXJnZXREaWFncmFtKTsNCQkJCQkJQ0RPUmVzb3VyY2UgdGFyZ2V0RGlhZ3JhbVJlc291cmNlICA9IHRyYW5zYWN0aW9uQ0RPLmdldE9yQ3JlYXRlUmVzb3VyY2UodGFyZ2V0RGlhZ3JhbSk7DQkJCQkJCURhd25BcmdEaWFncmFtVXRpbCBteURpYWdyYW0gPSBuZXcgRGF3bkFyZ0RpYWdyYW1VdGlsKHNvdXJjZURpYWdyYW1SZXNvdXJjZSwgbGlzdFJvb3RPYmplY3RzLCB0YXJnZXRSZXNvdXJjZS5nZXRVUkkoKSwgdGFyZ2V0RGlhZ3JhbVJlc291cmNlLmdldFVSSSgpLCBhcmdGb2xkZXIsIHRyYW5zYWN0aW9uQ0RPKTsNCQkJCQkJbXlEaWFncmFtLmdlbmVyYXRlRGlhZ3JhbShtb25pdG9yKTsNCQkJCQl9DQkJCQkJLy9NQ1A6IHNlIGxhbnphIExvY2FsQ29tbWl0Q29uZmxpY3RFeGNlcHRpb24hISE7IGxvcyBhbnRlcmlvcmVzIGNvbW1pdCBzb24gc2luIHBhcmFtZXRybyBwZXJvIHNpZ3VlIGVsIHByb2JsZW1hDQkJCQkJU2V0PENET09iamVjdD4gY29uZiA9IHRyYW5zYWN0aW9uQ0RPLmdldENvbmZsaWN0cygpOw0JCQkJCWZvciAoSXRlcmF0b3I8Q0RPT2JqZWN0Pml0ID0gY29uZi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQkJCQkJCUNET09iamVjdCBuZXh0T2JqZWN0ID0gaXQubmV4dCgpOw0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvcHlBcmd1bWVudGF0aW9uczogY29uZmljdCAiK25leHRPYmplY3QudG9TdHJpbmcoKSk7DQkJCQkJfQ0JCQkJCXRyYW5zYWN0aW9uQ0RPLmNvbW1pdCgpOy8vPz8/TUNQDQkJCQkJLy8gTUNQIENyb3NzUHJvamVjdA0JCQkJCXRhcmdldEFzc2V0c1BhY2thZ2UuZ2V0QXJndW1lbnRhdGlvbk1vZGVsKCkuYWRkKChDYXNlKSB0YXJnZXRSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7DQkJCQkJcmVzb3VyY2VBUFRhcmdldC5zYXZlKG9wdGlvbnMpOw0JCQkJCS8vIE1DUCBDcm9zc1Byb2plY3QNCQkJCQkvLz8/P3RyYW5zYWN0aW9uLmNsb3NlKCk7DQkJCQkJLy8gTUNQIENyb3NzUHJvamVjdAkJCQ0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIkFyZ3VtZW50YXRpb24gcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sJCQkJCQ0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQkJCQkJdHJhbnNhY3Rpb25DRE8ucm9sbGJhY2soKTsNCQkJCQlkaWFsb2cuY2xvc2UoKTsKCQkJCQlyZXR1cm4gZmFsc2U7DQkJCQl9DQoJCQl9DQoJCQlkaWFsb2cuY2xvc2UoKTsNCgkJfS8vIGN5Y2xlIGZvcg0KCQkNCgkJcmV0dXJuIHRydWU7DQoJfQkgDQoJCQkNCgkNCglwcml2YXRlIGJvb2xlYW4gY29weVByb2Nlc3NlcygpIHsNCgkJQXJyYXlMaXN0PE9iamVjdD4gYWxsT2JqZWN0cyA9bnVsbDsNCgkJDQoJCWJvb2xlYW4gaXNNb2RlbENoZWNrZWQgPSBmYWxzZTsNCg0KCQlmb3IgKCBFT2JqZWN0IGtleSA6IHByb2Nlc3NBbGxTZWxlY3RlZE9iamVjdHMua2V5U2V0KCkgKSB7DQoJCQlDRE9SZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSAgPSAoQ0RPUmVzb3VyY2Upa2V5Ow0KCQkJcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5wdXQoc291cmNlUmVzb3VyY2UsIG51bGwpOw0KCQkJaXNNb2RlbENoZWNrZWQgPSBjaGVja3RyZWVQcm9jZXNzU291cmNlLmdldENoZWNrZWQoa2V5KTsNCgkJCWlmIChpc01vZGVsQ2hlY2tlZCkgew0KCQkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCB0cmVlVmlldyA9IG51bGw7DQoJCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbnVsbDsNCgkJCQkNCgkJCQlVUkkgdXJpPXNvdXJjZVJlc291cmNlLmdldFVSSSgpOw0KCQkJCURhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCgkJCQlQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBwYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpOw0KCSAgICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgew0KCSAgICAgICAgICAgIAl0cmVlVmlldyA9IGVkaXRvci5nZXRUcmVlVmlld2VyV2l0aENoZWNrKCk7DQoJICAgICAgICAgICAgfQ0KCSAgICAgICAgICAgIA0KCQkJCWlmICh0cmVlVmlldyE9bnVsbCkgew0KCQkJCQlzZWxlY3RlZE9iamVjdHMgPSB0cmVlVmlldy5nZXRDaGVja2VkRWxlbWVudHMoKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlhbGxPYmplY3RzPSBuZXcgQXJyYXlMaXN0KCk7DQoJCQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3IgPSBzb3VyY2VSZXNvdXJjZS5nZXRBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQoJCQkJCQlFT2JqZWN0IGFFT2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOw0KCQkJCQkJYWxsT2JqZWN0cy5hZGQoYUVPYmplY3QpOw0KCQkJCQl9DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IGFsbE9iamVjdHMudG9BcnJheSgpOw0KCQkJCX0NCgkJCQlwcm9jZXNzQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQlTdHJpbmcgcHJvamVjdFBhdGg9IHJlc291cmNlQVBUYXJnZXQuZ2V0UGF0aCgpOwkJCQkNCg0KCQkJCVN0cmluZyBbXSBwYXRoUGFydHM9IHByb2plY3RQYXRoLnNwbGl0KCJBU1NVUkFOQ0VfUFJPSkVDVCIpOw0KCQkJCVN0cmluZyB0YXJnZXRQYXRoPXBhdGhQYXJ0c1swXSsgIlBST0NFU1NFUy8iICsgc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpOw0KCQkJCQkJCQkJCQkNCgkJCQl0YXJnZXRQYXRoID0gY3JlYXRlTm90RXhpc3RpbmdOYW1lKHRhcmdldFBhdGgpOw0KCQkJCUNET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IHRyYW5zYWN0aW9uQ0RPLmNyZWF0ZVJlc291cmNlKHRhcmdldFBhdGgpOw0KCQkJCS8vZGlhZ3JhbVJlc291cmNlICA9IHRyYW5zYWN0aW9uLmdldE9yQ3JlYXRlUmVzb3VyY2UoYXNzdXJhbmNlcHJvamVjdEZvbGRlci5nZXRQYXRoKCkgKyAiLyIgKyBiYXNlbGluZU5hbWUgKyAiLmJhc2VsaW5lX2RpYWdyYW0iKTsNCgkJCQkvL1RvIGNvcHkgdGhlIHJlZmZyYW1ld29yayBhcyBiYXNlbGluZQ0KCQkJCS8vTUNQQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gYXNzdXJhbmNlcHJvamVjdEZvbGRlci5hZGRSZXNvdXJjZShiYXNlbGluZU5hbWUgKyAiLmJhc2VsaW5lIik7DQoJDQoJCQkJaW5pdENvcHkoc291cmNlUmVzb3VyY2UsIHRhcmdldFJlc291cmNlLCBzZWxlY3RlZE9iamVjdHMpOwkJCSAgICANCg0KCQkJCXRyeSB7CQkJCQ0KCQkJCQl0YXJnZXRSZXNvdXJjZS5zYXZlKG9wdGlvbnMpOw0KCQkJCQkNCgkJCQkJdGFyZ2V0QXNzZXRzUGFja2FnZS5nZXRQcm9jZXNzTW9kZWwoKS5hZGQoKFByb2Nlc3NNb2RlbCkgdGFyZ2V0UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOw0KCQkJCQlyZXNvdXJjZUFQVGFyZ2V0LnNhdmUob3B0aW9ucyk7DQoJDQoJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIlByb2Nlc3MgcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0KCQ0KCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJCXRyYW5zYWN0aW9uQ0RPLnJvbGxiYWNrKCk7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9CQ0KCQl9DQoJCXJldHVybiB0cnVlOw0KCX0NCg0KCXByaXZhdGUgdm9pZCBpbml0Q29weShDRE9SZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSwgQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UsIE9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cykgew0KCQkvLyBDcmVhdGUgZW1wdHkgcm9vdHMNCgkJYm9vbGVhbiBvYmpDaGVja2VkID0gZmFsc2U7DQoJCWZvciAoRU9iamVjdCBhRU9iamVjdCA6IHNvdXJjZVJlc291cmNlLmdldENvbnRlbnRzKCkpIHsNCgkJCXRhcmdldFJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFFT2JqZWN0KSk7DQoJCX0NCg0KCQkvLyBDb3B5IEVPYmplY3RzLCBjb250YWlubWVudCBpbiB0aGUgcmVzb3VyY2UgaXMgZG9uZSBhdXRvbWF0aWNhbGx5IHNpbmNlIHdlIGhhdmUNCgkJLy8gYWxyZWFkeSBhdHRhY2hlZCB0aGUgY29ycmVzcG9uZGluZyByb290IEVPYmplY3QgdG8gdGhlIHRhcmdldCByZXNvdXJjZQ0KCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yID0gc291cmNlUmVzb3VyY2UuZ2V0QWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KCQkJRU9iamVjdCBhRU9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsNCgkJCQ0KCQkJLy9Bdm9pZCBjb3B5IGFzc3VyYW5jZSBhc3NlbnQgZXZlbnRzDQoJCQlpZihhRU9iamVjdCBpbnN0YW5jZW9mIEFzc3VyYW5jZUFzc2V0RXZlbnQpew0KCQkJCWNvbnRpbnVlOw0KCQkJfQ0KCQkJDQoJCQlpZihzZWxlY3RlZE9iamVjdHMhPW51bGwpew0KCQkJCW9iakNoZWNrZWQgPSBmYWxzZTsNCgkJCQlvYmpDaGVja2VkID0gZXhpc3RPYmplY3QoYUVPYmplY3QsIHNlbGVjdGVkT2JqZWN0cyk7DQoJCQkJaWYgKG9iakNoZWNrZWQ9PWZhbHNlKSB7DQoJCQkJCSAgY29udGludWU7DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQlFT2JqZWN0IGJFT2JqZWN0ID0gZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoYUVPYmplY3QpOw0KDQoJCQljb3B5QUVPYmplY3RUb0JFT2JqZWN0KGFFT2JqZWN0LCBiRU9iamVjdCwgc2VsZWN0ZWRPYmplY3RzKTsNCg0KCQkJLy8gTUNQIENyb3NzUHJvamVjdAkJCQ0KCQkJaWYoYUVPYmplY3QgaW5zdGFuY2VvZiBNb2RlbEVsZW1lbnQpDQoJCQl7DQoJCSAgICAgICAgQ0RPSUQgY2RvSUQgPSBDRE9VdGlsLmdldENET09iamVjdChhRU9iamVjdCkuY2RvSUQoKTsNCgkJICAgICAgICBMb25nICBjZG9JZExvbmcgPSBuZXcgTG9uZyhjZG9JRC50b1VSSUZyYWdtZW50KCkpOw0KCQkJCWVJRFRvT2JqZWN0TWFwLnB1dChjZG9JRC50b1N0cmluZygpLCBiRU9iamVjdCk7DQoJCQl9DQoJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0CQkJDQoJCX0NCgl9CQ0KCQ0KCXByaXZhdGUgYm9vbGVhbiBleGlzdE9iamVjdChPYmplY3Qgc2VhcmNoZWRPYmosIE9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyl7DQoJCWJvb2xlYW4gZXhpc3QgPSBmYWxzZTsNCgkJZm9yKE9iamVjdCBlbGVtZW50OiBzZWxlY3RlZE9iamVjdHMpew0KCQkJaWYgKGVsZW1lbnQudG9TdHJpbmcoKS5lcXVhbHMoc2VhcmNoZWRPYmoudG9TdHJpbmcoKSkpIHsNCgkJCQlleGlzdCA9IHRydWU7DQoJCQkJLy9zZWxlY3RlZE9iamVjdHM9IEFycmF5VXRpbHMucmVtb3ZlRWxlbWVudChzZWxlY3RlZE9iamVjdHMsZWxlbWVudCk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGV4aXN0Ow0KCX0NCgkNCglwcml2YXRlICBFT2JqZWN0IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KEVPYmplY3QgYUVPYmplY3QpIHsNCgkJDQoJCUVPYmplY3QgYkVPYmplY3QgPSBtYXAuZ2V0KGFFT2JqZWN0KTsJCQkNCgkJaWYgKGJFT2JqZWN0ID09IG51bGwpIHsJCQkNCgkJCWlmKGFFT2JqZWN0IGluc3RhbmNlb2YgTWFwR3JvdXApew0KCQkJCWZvciAoIEVPYmplY3Qga2V5IDogbWFwLmtleVNldCgpICkgew0KCQkJCSAgIGlmKGtleSBpbnN0YW5jZW9mIE1hcEdyb3VwKXsNCgkJCQkJICAgaWYoQ0RPVXRpbC5nZXRDRE9PYmplY3Qoa2V5KS5jZG9JRCgpID09IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGFFT2JqZWN0KS5jZG9JRCgpKXsNCgkJCQkJCSAgIHJldHVybiBtYXAuZ2V0KGtleSk7DQoJCQkJCSAgIH0NCgkJCQkgICB9DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQlFQ2xhc3MgYUVDbGFzcyA9IGFFT2JqZWN0LmVDbGFzcygpOwkJCQ0KCQkJLy9pZihhRUNsYXNzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJSZWYiKSl7DQoJCQkNCgkJCQkvL1N0cmluZyBiQ2xhc3NOYW1lID0gYUVDbGFzcy5nZXROYW1lKCkucmVwbGFjZUZpcnN0KCJSZWYiLCAiQmFzZSIpOw0KCQkJCS8vIFNlY29uZCBzZWFyY2ggdGhlIGNvcnJlc3BvbmRpbmcgRUNsYXNzIGluIEJQYWNrYWdlDQoJCQkJLy9FQ2xhc3MgYkVDbGFzcyA9IChFQ2xhc3MpIEJhc2VsaW5lUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXIoYkNsYXNzTmFtZSk7DQoJCQkJLy8gQ3JlYXRlIGEgbmV3IGVtcHR5IGluc3RhbmNlIGFuZCByZWdpc3RlciB0byBhdm9pZCBkdXBzDQoJCQkJYkVPYmplY3QgPSBFY29yZVV0aWwuY3JlYXRlKGFFQ2xhc3MpOw0KCQkJCW1hcC5wdXQoYUVPYmplY3QsIGJFT2JqZWN0KTsNCgkJCS8vfQ0KCQkJIC8qaWYgKGFFQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscygiTWFwSnVzdGlmaWNhdGlvbiIpKXsNCgkJCQliRU9iamVjdCA9IEVjb3JlVXRpbC5jcmVhdGUoYUVDbGFzcyk7DQoJCQkJbWFwLnB1dChhRU9iamVjdCwgYkVPYmplY3QpOw0KCQkJfQ0KCQkJZWxzZSBpZiAoYUVDbGFzcy5nZXROYW1lKCkuZXF1YWxzKCJNYXBHcm91cCIpKXsNCgkJCQliRU9iamVjdCA9IEVjb3JlVXRpbC5jcmVhdGUoYUVDbGFzcyk7DQoJCQkJbWFwLnB1dChhRU9iamVjdCwgYkVPYmplY3QpOw0KCQkJfQ0KCQkJZWxzZXsqLw0KCQkJCS8vYkVPYmplY3Q9YUVPYmplY3Q7DQoJCQkJLy9tYXAucHV0KGFFT2JqZWN0LCBhRU9iamVjdCk7DQoJCQkvL30NCgkJfQ0KCQlyZXR1cm4gYkVPYmplY3Q7DQoJfQ0KCQ0KCXByaXZhdGUgIHZvaWQgY29weUFFT2JqZWN0VG9CRU9iamVjdChFT2JqZWN0IGFFT2JqZWN0LCBFT2JqZWN0IGJFT2JqZWN0LCBPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMpIHsNCgkJYm9vbGVhbiBvYmpDaGVja2VkID0gZmFsc2U7DQoJCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGFGZWF0dXJlIDogYUVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpKSB7DQoJCQlpZiAoYUVPYmplY3QuZUlzU2V0KGFGZWF0dXJlKSkgew0KCQkJCS8vIEdldCB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGluIHRoZSB0YXJnZXQgRUNsYXNzLg0KCQkJCS8vIEdldCBzaW1wbHkgdGhlIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBuYW1lDQoJCQkJDQoJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGJGZWF0dXJlID0gYkVPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGFGZWF0dXJlLmdldE5hbWUoKSk7CQkJCQkJCQkNCgkJCQkNCgkJCQlpZihiRmVhdHVyZSAhPSBudWxsKXsNCgkJCQkJaWYgKGFGZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgew0KCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQl9IGVsc2UgeyAvLyBFUmVmZXJlbmNlDQoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQ0KCQkJCQkJaWYoYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiQmFzZUVxdWl2YWxlbmNlTWFwIikgJiYgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygidGFyZ2V0IikgKXsNCgkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCX0NCgkJCQkJCWVsc2UgaWYoYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVmRnJhbWV3b3JrIikgfHwgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVmQXNzdXJhYmxlRWxlbWVudCIpKXsNCgkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCX0NCgkJCQkJCWVsc2UgaWYoYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiQmFzZUNvbXBsaWFuY2VNYXAiKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJ0YXJnZXQiKSApew0KCQkJCQkJCWlmKGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpIGluc3RhbmNlb2YgRUxpc3Qpew0KCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCgkJCQkJCQkJRUxpc3Q8RU9iamVjdD4gYUxpc3QgPSAoRUxpc3Q8RU9iamVjdD4pIGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpOw0KCQkJCQkJCQlFTGlzdDxFT2JqZWN0PiBiTGlzdCA9IG5ldyBCYXNpY0VMaXN0PEVPYmplY3Q+KCk7IA0KCQkJCQkJCQlib29sZWFuIGhhc0VsZW1lbnRzID0gZmFsc2U7DQoJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYUxpc3Quc2l6ZSgpOyBpKyspIHsNCgkJCQkJCQkJCWlmICgoYUxpc3QuZ2V0KGkpIGluc3RhbmNlb2YgQXJ0ZWZhY3QpIHx8IChhTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBBcnRlZmFjdERlZmluaXRpb24pKSB7DQoJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJCWZvciAoIEVPYmplY3Qga2V5IDogZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMua2V5U2V0KCkgKSB7DQoJCQkJCQkJCQkJCWlmKGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpIT1udWxsKXsNCgkJCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhTGlzdC5nZXQoaSksIGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpKTsNCgkJCQkJCQkJCQkJCWlmIChvYmpDaGVja2VkPT10cnVlKSB7DQoJCQkJCQkJCQkJCQkJYkxpc3QuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFMaXN0LmdldChpKSkpOw0KCQkJCQkJCQkJCQkJCWhhc0VsZW1lbnRzID0gdHJ1ZTsNCgkJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWVsc2UgaWYgKChhTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgfHwgKGFMaXN0LmdldChpKSBpbnN0YW5jZW9mIFBhcnRpY2lwYW50KSkgew0KCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCQlmb3IgKCBFT2JqZWN0IGtleSA6IHByb2Nlc3NBbGxTZWxlY3RlZE9iamVjdHMua2V5U2V0KCkgKSB7DQoJCQkJCQkJCQkJCWlmKHByb2Nlc3NBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkhPW51bGwpew0KCQkJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGV4aXN0T2JqZWN0KGFMaXN0LmdldChpKSwgcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSk7DQoJCQkJCQkJCQkJCQlpZiAob2JqQ2hlY2tlZD09dHJ1ZSkgew0KCQkJCQkJCQkJCQkJCWJMaXN0LmFkZChnZXRDb3JyZXNwb25kaW5nRU9iamVjdChhTGlzdC5nZXQoaSkpKTsNCgkJCQkJCQkJCQkJCQloYXNFbGVtZW50cyA9IHRydWU7DQoJCQkJCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQllbHNlIGlmIChhTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBDbGFpbSkgew0KCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCQlmb3IgKCBFT2JqZWN0IGtleSA6IGFyZ0FsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCQkJCQkJCQkJaWYoYXJnQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpIT1udWxsKXsNCgkJCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhTGlzdC5nZXQoaSksIGFyZ0FsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSk7DQoJCQkJCQkJCQkJCQlpZiAob2JqQ2hlY2tlZD09dHJ1ZSkgew0KCQkJCQkJCQkJCQkJCWJMaXN0LmFkZChnZXRDb3JyZXNwb25kaW5nRU9iamVjdChhTGlzdC5nZXQoaSkpKTsNCgkJCQkJCQkJCQkJCQloYXNFbGVtZW50cyA9IHRydWU7DQoJCQkJCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJaWYgKGhhc0VsZW1lbnRzKSB7DQoJCQkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBiTGlzdCk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9CQ0KCQkJCQkJDQoJCQkJCQl9DQoJCQkJCQllbHNlIGlmKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkluZm9ybWF0aW9uRWxlbWVudENpdGF0aW9uIikgJiYgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygiYXJ0ZWZhY3QiKSApew0KCQkJCQkJCWlmKGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpIGluc3RhbmNlb2YgRUxpc3Qpew0KCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCgkJCQkJCQkJRUxpc3Q8RU9iamVjdD4gYUxpc3QgPSAoRUxpc3Q8RU9iamVjdD4pIGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpOw0KCQkJCQkJCQlFTGlzdDxFT2JqZWN0PiBiTGlzdCA9IG5ldyBCYXNpY0VMaXN0PEVPYmplY3Q+KCk7IA0KCQkJCQkJCQlib29sZWFuIGhhc0VsZW1lbnRzID0gZmFsc2U7DQoJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYUxpc3Quc2l6ZSgpOyBpKyspIHsNCgkJCQkJCQkJCW9iakNoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCWZvciAoIEVPYmplY3Qga2V5IDogZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMua2V5U2V0KCkgKSB7DQoJCQkJCQkJCQkJaWYoZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkhPW51bGwpew0KCQkJCQkJCQkJCQlvYmpDaGVja2VkID0gZXhpc3RPYmplY3QoYUxpc3QuZ2V0KGkpLCBldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSk7DQoJCQkJCQkJCQkJCWlmIChvYmpDaGVja2VkPT10cnVlKSB7DQoJCQkJCQkJCQkJCQliTGlzdC5hZGQoZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoYUxpc3QuZ2V0KGkpKSk7DQoJCQkJCQkJCQkJCQloYXNFbGVtZW50cyA9IHRydWU7DQoJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQlpZiAoaGFzRWxlbWVudHMpIHsNCgkJCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGJMaXN0KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0JDQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCWVsc2UgaWYoIChhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJQYXJ0aWNpcGFudCIpICYmIGFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm93bmVkQXJ0ZWZhY3QiKSApIHx8DQoJCQkJCQkJCSAoYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiQWN0aXZpdHkiKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJyZXF1aXJlZEFydGVmYWN0IikgKSB8fA0KCQkJCQkJCQkgKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkFjdGl2aXR5IikgJiYgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicHJvZHVjZWRBcnRlZmFjdCIpICkgfHwNCgkJCQkJCQkJIChhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJUZWNobmlxdWUiKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJjcmVhdGVkQXJ0ZWZhY3QiKSApICl7DQoJCQkJCQkJaWYoYUVPYmplY3QuZUdldChhRmVhdHVyZSkgaW5zdGFuY2VvZiBFTGlzdCl7DQoJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCQkJCQkJCQlFTGlzdDxFT2JqZWN0PiBhTGlzdCA9IChFTGlzdDxFT2JqZWN0PikgYUVPYmplY3QuZUdldChhRmVhdHVyZSk7DQoJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGJMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsgDQoJCQkJCQkJCWJvb2xlYW4gaGFzRWxlbWVudHMgPSBmYWxzZTsNCgkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgew0KCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJZm9yICggRU9iamVjdCBrZXkgOiBldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCQkJCQkJCQlpZihldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSE9bnVsbCl7DQoJCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhTGlzdC5nZXQoaSksIGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpKTsNCgkJCQkJCQkJCQkJaWYgKG9iakNoZWNrZWQ9PXRydWUpIHsNCgkJCQkJCQkJCQkJCWJMaXN0LmFkZChnZXRDb3JyZXNwb25kaW5nRU9iamVjdChhTGlzdC5nZXQoaSkpKTsNCgkJCQkJCQkJCQkJCWhhc0VsZW1lbnRzID0gdHJ1ZTsNCgkJCQkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWlmIChoYXNFbGVtZW50cykgew0KCQkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgYkxpc3QpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQkNCgkJCQkJCX0NCgkJCQkJCS8qZWxzZSBpZihhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJNYXBHcm91cCIpKXsNCgkJCQkJCQlFT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBjb3B5KTsJCQkJCQkJDQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCWVsc2UgaWYoYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVmRnJhbWV3b3JrIikgfHwgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygicmVmQXNzdXJhYmxlRWxlbWVudCIpKXsNCgkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCX0NCgkJCQkJCS8qZWxzZSBpZiAoYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibWFwSnVzdGlmaWNhdGlvbiIpKXsNCgkJCQkJCQlFT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQkvL2NvcHlBRU9iamVjdFRvQkVPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSksY29weSwgbnVsbCk7DQoJCQkJCQkJDQoJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgY29weSk7DQoJCQkJCQl9Ki8NCgkJCQkJCS8qZWxzZSBpZiAoYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygib3duZWRUZWNobmlxdWUiKSl7DQoJCQkJCQkJRU9iamVjdCBjb3B5PSBnZXRDb3JyZXNwb25kaW5nRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCQkJLy9jb3B5QUVPYmplY3RUb0JFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpLGNvcHksIG51bGwpOw0KCQkJCQkJCQ0KCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGNvcHkpOw0KCQkJCQkJfSovCQkJCQkJDQoJCQkJCQllbHNlIGlmIChhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtYXBHcm91cCIpKXsNCgkJCQkJCQlpZihhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJCYXNlQ29tcGxpYW5jZU1hcCIpKXsNCgkJCQkJCQkJRU9iamVjdCBjb3B5PSBnZXRDb3JyZXNwb25kaW5nRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGNvcHkpOw0KCQkJCQkJCX0NCgkJCQkJCQllbHNlew0KCQkJCQkJCS8vRU9iamVjdCBjb3B5PSBnZXRDb3JyZXNwb25kaW5nRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCQkJLy9jb3B5QUVPYmplY3RUb0JFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpLGNvcHksIG51bGwpOw0KCQkJCQkJCQ0KCQkJCQkJCS8vYkVPYmplY3QuZVNldChiRmVhdHVyZSwgY29weSk7DQoJCQkJCQkJDQoJCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWVsc2V7CQ0KCQkJCQkJCWlmKCFhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJsaWZlY3ljbGVFdmVudCIpKXsNCgkJCQkJCQkJaWYoYUVPYmplY3QuZUdldChhRmVhdHVyZSkgaW5zdGFuY2VvZiBFTGlzdCl7DQoJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCgkJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGFMaXN0ID0gKEVMaXN0PEVPYmplY3Q+KSBhRU9iamVjdC5lR2V0KGFGZWF0dXJlKTsNCgkJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGJMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsgDQoJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7DQoJCQkJCQkJCQkJaWYoc2VsZWN0ZWRPYmplY3RzIT1udWxsKXsNCgkJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJCQlvYmpDaGVja2VkID0gZXhpc3RPYmplY3QoYUxpc3QuZ2V0KGkpLCBzZWxlY3RlZE9iamVjdHMpOw0KCQkJCQkJCQkJCQlpZiAob2JqQ2hlY2tlZD09ZmFsc2UpIHsNCgkJCQkJCQkJCQkJCSAgY29udGludWU7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJYkxpc3QuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFMaXN0LmdldChpKSkpOw0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgYkxpc3QpOw0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2V7DQoJCQkJCQkJCQlpZihzZWxlY3RlZE9iamVjdHMhPW51bGwpew0KCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCQlvYmpDaGVja2VkID0gZXhpc3RPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSksIHNlbGVjdGVkT2JqZWN0cyk7DQoJCQkJCQkJCQkJaWYgKG9iakNoZWNrZWQ9PWZhbHNlKSB7DQoJCQkJCQkJCQkJCSAgY29udGludWU7DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgIiArIGFGZWF0dXJlLmdldE5hbWUoKSArICIgb2YgIiArIGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKSArICIgbm90IGNvcGllZCB0byBCYXNlbGluZSIpOw0KCQkJCQkJCQkJRU9iamVjdCBjb3B5PSBnZXRDb3JyZXNwb25kaW5nRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCQkJCQkvL2NvcHlBRU9iamVjdFRvQkVPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSksY29weSwgbnVsbCk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGNvcHkpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCQ0KCQkvL0FkZCB0aGUgbGlua2YgdG8gdGhlIHJlZmZyYW1lb3JrIG1vZGVsIGNvbmNlcHRzLg0KCQkNCgkJLyppZihhRU9iamVjdCBpbnN0YW5jZW9mIFJlZkZyYW1ld29yayl7DQoJCQkgRVN0cnVjdHVyYWxGZWF0dXJlIGJGZWF0dXJlID0gYkVPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJyZWZGcmFtZXdvcmsiKTsNCgkJCSBiRU9iamVjdC5lU2V0KGJGZWF0dXJlLGFFT2JqZWN0KTsNCgkJfQ0KCQllbHNlIGlmKGJFT2JqZWN0IGluc3RhbmNlb2YgQmFzZUFzc3VyYWJsZUVsZW1lbnQpew0KCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGJGZWF0dXJlID0gYkVPYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJyZWZBc3N1cmFibGVFbGVtZW50Iik7DQoJCQkgYkVPYmplY3QuZVNldChiRmVhdHVyZSxhRU9iamVjdCk7DQoJCX0qLw0KCQkNCgl9DQoNCglBcnJheUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPiBmaW5kQXNzdXJhbmNlUHJvamVjdHMoKXsNCgkJQXJyYXlMaXN0PENET1Jlc291cmNlTm9kZT4gcHJvamVjdExpc3Q9bmV3IEFycmF5TGlzdDxDRE9SZXNvdXJjZU5vZGU+KCk7DQoJCUNET1Jlc291cmNlTm9kZVtdIGxpc3RSPSAgdHJhbnNhY3Rpb25DRE8uZ2V0RWxlbWVudHMoKTsJCQkNCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Ui5sZW5ndGg7IGkrKykgew0KCQkJaWYgKGxpc3RSW2ldIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VGb2xkZXIpIHsNCgkJCQljaGVja0ZvbGRlckNvbnRlbnRzKChDRE9SZXNvdXJjZUZvbGRlcikgbGlzdFJbaV0sQVNTVVJBTkNFUFJPSkVDVCwgcHJvamVjdExpc3QpOw0KCQkJfSBlbHNlIGlmIChsaXN0UltpXS5nZXROYW1lKCkuZW5kc1dpdGgoQVNTVVJBTkNFUFJPSkVDVCkpIHsNCgkJCQlwcm9qZWN0TGlzdC5hZGQobGlzdFJbaV0pOw0KLy8JCQkJcmVmTGlzdERpck1hcC5hZGQobGlzdFJbaV0uZ2V0UGF0aCgpKTsNCgkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaXN0UltpXS5nZXRQYXRoKCkpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBwcm9qZWN0TGlzdDsNCgl9DQoJDQoNCglwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVhZFBlcm1pc3Npb24oQ0RPUmVzb3VyY2VOb2RlIG5vZGUpIHsNCgkJLy8gZm9yY2UgdG8gZ2V0IHRoZSBsYXN0IHJldmlzaW9uDQoJCW5vZGUuY2RvUmVsb2FkKCk7DQoJCUNET1Blcm1pc3Npb24gcGVybWlzc2lvbiA9IG5vZGUuY2RvUmV2aXNpb24oKS5nZXRQZXJtaXNzaW9uKCk7DQoJCXJldHVybiBwZXJtaXNzaW9uLmlzUmVhZGFibGUoKTsNCgl9DQoJDQoJcHJpdmF0ZSBBcnJheUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPiBjaGVja0ZvbGRlckNvbnRlbnRzKENET1Jlc291cmNlRm9sZGVyIGNkb1Jlc291cmNlRm9sZGVyLCBTdHJpbmcgc0NhZGVuYSwgQXJyYXlMaXN0PENET1Jlc291cmNlTm9kZT5wcm9qZWN0TGlzdCkgew0KCQlpZiAoaGFzUmVhZFBlcm1pc3Npb24oY2RvUmVzb3VyY2VGb2xkZXIpKSB7DQoJCQlFTGlzdDxDRE9SZXNvdXJjZU5vZGU+IGxpc3ROID0gY2RvUmVzb3VyY2VGb2xkZXIuZ2V0Tm9kZXMoKTsNCgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE4uc2l6ZSgpOyBpKyspIHsNCgkJCQlpZiAobGlzdE4uZ2V0KGkpIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VGb2xkZXIpIHsNCgkJCQkJY2hlY2tGb2xkZXJDb250ZW50cygoQ0RPUmVzb3VyY2VGb2xkZXIpIGxpc3ROLmdldChpKSwgc0NhZGVuYSwgcHJvamVjdExpc3QpOw0KCQkJCX0gZWxzZSBpZiAobGlzdE4uZ2V0KGkpLmdldE5hbWUoKS5lbmRzV2l0aChzQ2FkZW5hKSkgew0KCQkJCQlwcm9qZWN0TGlzdC5hZGQobGlzdE4uZ2V0KGkpKTsNCgkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obGlzdE4uZ2V0KGkpLmdldFBhdGgoKSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCXJldHVybiBwcm9qZWN0TGlzdDsNCgl9DQoJDQoJcHJvdGVjdGVkIHZvaWQgc291cmNlUHJvamVjdENoYW5nZWQoKSB7DQoJCWludCBzb3VyY2VpbmRleD1zb3VyY2VQcm9qZWN0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsNCgkJQ0RPUmVzb3VyY2VOb2RlIHNlbGVjdGVkU291cmNlPXByb2plY3RzLmdldChzb3VyY2VpbmRleCk7DQoJCVJlc291cmNlU2V0ICBiYXNlbGluZVNvdXJjZVJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KCQliYXNlbGluZVNvdXJjZVJlc291cmNlU2V0LmVTZXREZWxpdmVyKHRydWUpOw0KCQl0cnkgew0KCQkJDQoJCQlDRE9SZXNvdXJjZSBhcnRlZmFjdFJlc291cmNlID0gbnVsbDsNCgkJCUNET1Jlc291cmNlIHByb2Nlc3NSZXNvdXJjZSA9IG51bGw7DQoJCQlDRE9SZXNvdXJjZSBhcmdSZXNvdXJjZSA9IG51bGw7DQoJCQkNCgkJCXJlc291cmNlQVBTb3VyY2UgPSB0cmFuc2FjdGlvbkNETy5nZXRSZXNvdXJjZShzZWxlY3RlZFNvdXJjZS5nZXRQYXRoKCkpOw0KCQkJYXNzdXJhbmNlUHJvamVjdFNvdXJjZSA9IChBc3N1cmFuY2VQcm9qZWN0KSByZXNvdXJjZUFQU291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOw0KCQkJaWYodGFyZ2V0UHJvamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk+LTEpew0KCQkJCXJldXNlQnRuLnNldEVuYWJsZWQodHJ1ZSk7DQoJCQl9CQkJCQkJDQoJCQkvL0xvYWQgU291cmNlIEJhc2VsaW5lcw0KCQkJRUxpc3Q8QmFzZWxpbmVDb25maWc+IGxzdEJhc2VsaW5lQ29uZmlnID0gYXNzdXJhbmNlUHJvamVjdFNvdXJjZS5nZXRCYXNlbGluZUNvbmZpZygpOw0KCQkJSXRlcmF0b3I8QmFzZWxpbmVDb25maWc+IGJhc2VsaW5lQ29uZmlnID0gbHN0QmFzZWxpbmVDb25maWcuaXRlcmF0b3IoKTsNCgkJCQ0KCQkJQmFzZWxpbmVDb25maWcgYmNvbmZpZz1udWxsOw0KCQkJDQoJCQlib29sZWFuIGJGaW5kID0gZmFsc2U7DQoJCQl3aGlsZSAoYmFzZWxpbmVDb25maWcuaGFzTmV4dCgpICYmICFiRmluZCkgew0KCQkJCWJjb25maWcgPSBiYXNlbGluZUNvbmZpZy5uZXh0KCk7DQoJCQkJaWYgKGJjb25maWcuaXNJc0FjdGl2ZSgpKSB7DQoJCQkJCWJGaW5kID0gdHJ1ZTsNCgkJCQkJDQoJCQkJCUVMaXN0PEJhc2VGcmFtZXdvcms+IGxzdEJhc2VGcmFtZXdvcmsgPSBiY29uZmlnLmdldFJlZkZyYW1ld29yaygpOwkJCQkJCQkJCQkNCgkJCQkJSXRlcmF0b3I8QmFzZUZyYW1ld29yaz4gaXRiYXNlRnJhbWV3b3JrID0gbHN0QmFzZUZyYW1ld29yay5pdGVyYXRvcigpOw0KCQkJCQkNCgkJCQkJd2hpbGUgKGl0YmFzZUZyYW1ld29yay5oYXNOZXh0KCkpIHsNCgkJCQkJCQkJCQkJCQkJCQ0KCQkJCQkJQmFzZUZyYW1ld29yayBiYXNlRnJhbWV3b3JrID0gaXRiYXNlRnJhbWV3b3JrLm5leHQoKTsNCgkJCQkJCWJhc2VsaW5lUmVzb3VyY2UgPSBDRE9VdGlsLmdldENET09iamVjdChiYXNlRnJhbWV3b3JrKS5jZG9SZXNvdXJjZSgpOw0KCQkJCQkJdHJ5IHsNCgkJCQkJCQliYXNlbGluZVNvdXJjZVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChiYXNlbGluZVJlc291cmNlKTsNCgkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsNCgkJCQkJCQkvL0lnbm9yZSBpdCANCgkJCQkJCX0NCgkJCQkJCWJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChiYXNlbGluZVJlc291cmNlLCBudWxsKTsNCgkJCQkJfQ0KCQkJCQkvL3RyZWVCYXNlbGluZVNvdXJjZS5zZXRJbnB1dChiYXNlbGluZVNvdXJjZVJlc291cmNlU2V0KTsNCgkJCQkJCQ0KCQkJCQlDcmVhdGVNb2RlbEZyb21SZXNvdXJjZVNldChjaGVja3RyZWVCYXNlbGluZVNvdXJjZSwgYmFzZWxpbmVTb3VyY2VSZXNvdXJjZVNldCk7DQoJCQkJCWJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQ9IG51bGw7DQoJCQkJCS8vVG8gc2VhcmNoIHRoZSBub2RlcyB0byBiZSBtb3ZlZC4NCgkJCQkJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuZXhwYW5kQWxsKCk7DQoJCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCS8vVG8gZXhwYW5kIHRoZSBtb3ZlZCBub2Rlcy4NCgkJCQkJLy90cmVlQmFzZWxpbmVTb3VyY2UuZXhwYW5kQWxsKCk7DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQkvL0xvYWQgdGhlIGV2aWRlbmNlIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IA0KCQkJRUxpc3Q8QXNzZXRzUGFja2FnZT4gbHN0QXNzZXRzUGFja2FnZSA9IGFzc3VyYW5jZVByb2plY3RTb3VyY2UuZ2V0QXNzZXRzUGFja2FnZSgpOw0KCQkJSXRlcmF0b3I8QXNzZXRzUGFja2FnZT4gYXNzZXRzUGFja2FnZSA9IGxzdEFzc2V0c1BhY2thZ2UuaXRlcmF0b3IoKTsNCgkJCQ0KCQkJUmVzb3VyY2VTZXQgZXZpZGVuY2VTb3VyY2VSZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCgkJCUFzc2V0c1BhY2thZ2UgYVBhY2thZ2U9bnVsbDsNCgkJCQ0KCQkJLy9Mb2FkIHRoZSBhcmd1bWVudGF0aW9uIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IAkJCQkJCQkJCQkJCQ0KCQkJUmVzb3VyY2VTZXQgYXJnU291cmNlUmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7DQoJCQkNCgkJCS8vTG9hZCB0aGUgcHJvY2VzcyBtb2RlbHMgb2YgdGhlIGFjdGl2ZSBhc3NldHNQYWNrYWdlIG9mIHRoZSBzZWxlY3RlZCBhc3N1cmFuY2UgcHJvamVjdCAJCQkJCQkJCQkJCQkNCgkJCVJlc291cmNlU2V0IHByb2Nlc3NTb3VyY2VSZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCgkJCQ0KCQkJYkZpbmQgPSBmYWxzZTsNCgkJCXdoaWxlIChhc3NldHNQYWNrYWdlLmhhc05leHQoKSAmJiAhYkZpbmQpIHsNCgkJCQlhUGFja2FnZSA9IGFzc2V0c1BhY2thZ2UubmV4dCgpOw0KCQkJCWlmIChhUGFja2FnZS5pc0lzQWN0aXZlKCkpIHsNCgkJCQkJYkZpbmQ9IHRydWU7DQoJCQkJCUVMaXN0PEFydGVmYWN0TW9kZWw+IGxzdEFydGVmYWN0TW9kZWwgPSBhUGFja2FnZS5nZXRBcnRlZmFjdHNNb2RlbCgpOw0KCQkJCQlJdGVyYXRvcjxBcnRlZmFjdE1vZGVsPiBhcnRlZmFjdE1vZGVsID0gbHN0QXJ0ZWZhY3RNb2RlbC5pdGVyYXRvcigpOw0KCQkJCQl3aGlsZSAoYXJ0ZWZhY3RNb2RlbC5oYXNOZXh0KCkpIHsNCgkJCQkJCUFydGVmYWN0TW9kZWwgYXJ0ZWZhY3QgPSBhcnRlZmFjdE1vZGVsLm5leHQoKTsNCgkJCQkJCWFydGVmYWN0UmVzb3VyY2UgPSBDRE9VdGlsLmdldENET09iamVjdChhcnRlZmFjdCkuY2RvUmVzb3VyY2UoKTsNCgkJCQkJCXRyeSB7DQoJCQkJCQkJZXZpZGVuY2VTb3VyY2VSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQoYXJ0ZWZhY3RSZXNvdXJjZSk7DQoJCQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7DQoJCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaw0KCQkJCQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJCQkJCX0NCgkJCQkJCWV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChhcnRlZmFjdFJlc291cmNlLCBudWxsKTsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJRUxpc3Q8Q2FzZT4gbHN0QXJnTW9kZWwgPSBhUGFja2FnZS5nZXRBcmd1bWVudGF0aW9uTW9kZWwoKTsNCgkJCQkJSXRlcmF0b3I8Q2FzZT4gYXJnTW9kZWwgPSBsc3RBcmdNb2RlbC5pdGVyYXRvcigpOw0KCQkJCQl3aGlsZSAoYXJnTW9kZWwuaGFzTmV4dCgpKSB7DQoJCQkJCQlDYXNlIGFyZ1Jvb3QgPSBhcmdNb2RlbC5uZXh0KCk7DQoJCQkJCQlhcmdSZXNvdXJjZSA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGFyZ1Jvb3QpLmNkb1Jlc291cmNlKCk7DQoJCQkJCQl0cnkgew0KCQkJCQkJCWFyZ1NvdXJjZVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChhcmdSZXNvdXJjZSk7DQoJCQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7DQoJCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaw0KCQkJCQkJCS8vRG8gbm90aGluZw0KCQkJCQkJfQ0KCQkJCQkJYXJnQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChhcmdSZXNvdXJjZSwgbnVsbCk7DQoJCQkJCX0NCgkJCQkJDQoJCQkJCUVMaXN0PFByb2Nlc3NNb2RlbD4gbHN0UHJvY2Vzc01vZGVsID0gYVBhY2thZ2UuZ2V0UHJvY2Vzc01vZGVsKCk7DQoJCQkJCUl0ZXJhdG9yPFByb2Nlc3NNb2RlbD4gcHJvY2Vzc01vZGVsID0gbHN0UHJvY2Vzc01vZGVsLml0ZXJhdG9yKCk7DQoJCQkJCXdoaWxlIChwcm9jZXNzTW9kZWwuaGFzTmV4dCgpKSB7DQoJCQkJCQlQcm9jZXNzTW9kZWwgcHJvY2Vzc1Jvb3QgPSBwcm9jZXNzTW9kZWwubmV4dCgpOw0KCQkJCQkJcHJvY2Vzc1Jlc291cmNlID0gQ0RPVXRpbC5nZXRDRE9PYmplY3QocHJvY2Vzc1Jvb3QpLmNkb1Jlc291cmNlKCk7DQoJCQkJCQl0cnkgew0KCQkJCQkJCXByb2Nlc3NTb3VyY2VSZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocHJvY2Vzc1Jlc291cmNlKTsNCgkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsNCgkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQoJCQkJCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCQkJfQ0KCQkJCQkJcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5wdXQocHJvY2Vzc1Jlc291cmNlLCBudWxsKTsNCgkJCQkJfQkNCgkJCQl9DQoJCQkJQ3JlYXRlTW9kZWxGcm9tUmVzb3VyY2VTZXQoY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UsIGV2aWRlbmNlU291cmNlUmVzb3VyY2VTZXQpOw0KCQkJCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLmV4cGFuZEFsbCgpOw0KCQkJCQ0KCQkJCUNyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KGNoZWNrdHJlZUFyZ1NvdXJjZSwgYXJnU291cmNlUmVzb3VyY2VTZXQpOw0KCQkJCWNoZWNrdHJlZUFyZ1NvdXJjZS5leHBhbmRBbGwoKTsJDQoJCQkJDQoJCQkJQ3JlYXRlTW9kZWxGcm9tUmVzb3VyY2VTZXQoY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZSwgcHJvY2Vzc1NvdXJjZVJlc291cmNlU2V0KTsNCgkJCQljaGVja3RyZWVQcm9jZXNzU291cmNlLmV4cGFuZEFsbCgpOwkNCgkJCX0JDQoJCQkNCgkJCQ0KCQl9IGNhdGNoIChFeGNlcHRpb24gY2RvZSkgew0KCQkJY2RvZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJCXRyYW5zYWN0aW9uQ0RPLnJvbGxiYWNrKCk7DQoJCX0NCgl9DQoJDQoJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVJldXNlKCkgew0KCQlib29sZWFuIGFsbE9LPXRydWU7DQoJCWlmKHRhcmdldFByb2plY3RDb21iby5nZXRUZXh0KCkubGVuZ3RoKCk9PTApew0KCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobmV3IFNoZWxsKCksICJTZWxlY3RlZCBTb3VyY2UgUHJvamVjdCIsDQoJCQkJCSJZb3UgbXVzdCBzZWxlY3QgdGhlIHNvdXJjZSBwcm9qZWN0IG9mIHRoZSByZXVzZS4iKTsNCgkJCXJldHVybjsNCgkJfQ0KCQkNCgkJaWYgKCAoY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoIT0wKSB8fA0KCQkJCSAoY2hlY2t0cmVlQXJnU291cmNlLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCE9MCkgfHwNCgkJCQkgKGNoZWNrdHJlZVByb2Nlc3NTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoIT0wKSB8fA0KCQkJCSAoY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoIT0wKSkgew0KCQkJLy9Mb2FkIHRoZSBldmlkZW5jZSBtb2RlbHMgb2YgdGhlIGFjdGl2ZSBhc3NldHNQYWNrYWdlIG9mIHRoZSBzZWxlY3RlZCBhc3N1cmFuY2UgcHJvamVjdCANCgkJCUVMaXN0PEFzc2V0c1BhY2thZ2U+IGxzdEFzc2V0c1BhY2thZ2UgPSBhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0LmdldEFzc2V0c1BhY2thZ2UoKTsNCgkJCUl0ZXJhdG9yPEFzc2V0c1BhY2thZ2U+IGFzc2V0c1BhY2thZ2UgPSBsc3RBc3NldHNQYWNrYWdlLml0ZXJhdG9yKCk7DQoNCgkJCW1hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIEVPYmplY3Q+KCk7DQoJCQlvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQoJCQkNCgkJCXdoaWxlIChhc3NldHNQYWNrYWdlLmhhc05leHQoKSkgew0KCQkJCXRhcmdldEFzc2V0c1BhY2thZ2UgPSBhc3NldHNQYWNrYWdlLm5leHQoKTsNCgkJCQlpZiAodGFyZ2V0QXNzZXRzUGFja2FnZS5pc0lzQWN0aXZlKCkpIHsNCgkJCQkJYnJlYWs7CQkJCQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQllbHNlIHsNCgkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiU2VsZWN0ZWQgTW9kZWxzIiwNCgkJCQkJIllvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCBvbmUgbW9kZWwgdG8gYmUgcmV1c2VkLiIpOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJDQoJCXRyeSB7DQoJCQlpZiAoY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoIT0wKSB7DQoJCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhuZXcgU2hlbGwoKSwgIkNoYW5nZXMgdG8gdGFyZ2V0IEFzc3VyYW5jZSBQcm9qZWN0IiwNCgkJCQkJCSJUaGUgbW9kZWwgd2lsbCBiZSBjb3BpZWQgYW5kIHJlbGF0ZWQgdG8gYSBuZXcgQXNzZXQgUGFja2FnZSBhbmQgQmFzZWxpbmUgQ29uZmlndXJhdGlvbiB0aGF0IHdpbGwgYmUgc2V0IHVwIGFzIHRoZSBhY3RpdmUgb25lcy4iKTsNCgkJCQlwcm9qZWN0UGFja2FnZSA9IEFzc3VyYW5jZXByb2plY3RQYWNrYWdlLmVJTlNUQU5DRTsNCgkJCQlwcm9qZWN0RmFjdG9yeSA9IHByb2plY3RQYWNrYWdlLmdldEFzc3VyYW5jZXByb2plY3RGYWN0b3J5KCk7DQoJCQkJDQoJCQkJQXNzZXRzUGFja2FnZSBuZXdBUD0gcHJvamVjdEZhY3RvcnkuY3JlYXRlQXNzZXRzUGFja2FnZSgpOwkJCQkJCQkJDQoJCQkJbmV3QVAuc2V0SWQoIiIgKyBhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0LmdldEFzc2V0c1BhY2thZ2UoKS5zaXplKCkpOw0KCQkJCW5ld0FQLnNldE5hbWUoIkFQXyIgKyBhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0LmdldEFzc2V0c1BhY2thZ2UoKS5zaXplKCkpOw0KCQkJCW5ld0FQLnNldERlc2NyaXB0aW9uKCJDcmVhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIENyb3NzIFByb2plY3QgUmV1c2UiKTsJCQkNCgkJCQluZXdBUC5zZXRJc0FjdGl2ZSh0cnVlKTsNCgkJCQlhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0LmdldEFzc2V0c1BhY2thZ2UoKS5hZGQobmV3QVApOw0KCQkJCXRhcmdldEFzc2V0c1BhY2thZ2Uuc2V0SXNBY3RpdmUoZmFsc2UpOw0KCQkJCXRhcmdldEFzc2V0c1BhY2thZ2U9bmV3QVA7DQoJCQkJDQoJCQkJQmFzZWxpbmVDb25maWcgbmV3QkMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVCYXNlbGluZUNvbmZpZygpOw0KCQkJCW5ld0JDLnNldElkKCIiICsgYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXRCYXNlbGluZUNvbmZpZygpLnNpemUoKSk7DQoJCQkJbmV3QkMuc2V0TmFtZSgiQVBfIiArIGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QmFzZWxpbmVDb25maWcoKS5zaXplKCkpOw0KCQkJCW5ld0JDLnNldERlc2NyaXB0aW9uKCJDcmVhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIENyb3NzIFByb2plY3QgUmV1c2UiKTsJCQkNCgkJCQkNCgkJCQkvL0xvYWQgdGhlIGV2aWRlbmNlIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IA0KCQkJCUVMaXN0PEJhc2VsaW5lQ29uZmlnPiBsc3RCQyA9IGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QmFzZWxpbmVDb25maWcoKTsNCgkJCQlJdGVyYXRvcjxCYXNlbGluZUNvbmZpZz4gYmNJID0gbHN0QkMuaXRlcmF0b3IoKTsNCgkJCQkJCQkJCQkNCgkJCQkvL0luYWN0aXZlIHRoZSBhY3RpdmUgQmFzZWxpbmUgQ29uZmlnDQoJCQkJd2hpbGUgKGJjSS5oYXNOZXh0KCkpIHsNCgkJCQkJQmFzZWxpbmVDb25maWcgb25lQkMgPSBiY0kubmV4dCgpOw0KCQkJCQlpZiAob25lQkMuaXNJc0FjdGl2ZSgpKSB7DQoJCQkJCQlvbmVCQy5zZXRJc0FjdGl2ZShmYWxzZSk7CQkJCQ0KCQkJCQl9DQoJCQkJfQ0KCQkJCQ0KCQkJCW5ld0JDLnNldElzQWN0aXZlKHRydWUpOw0KCQkJCWFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QmFzZWxpbmVDb25maWcoKS5hZGQobmV3QkMpOw0KCQkJCWlmIChhbGxPSykgYWxsT0s9Y29weUV2aWRlbmNlcygpOw0KCQkJCWlmIChhbGxPSykgYWxsT0s9Y29weUFyZ3VtZW50YXRpb25zKCk7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5UHJvY2Vzc2VzKCk7CQ0KCQkJCWlmIChhbGxPSykgYWxsT0s9Y29weU1hcHMoKTsNCgkJCQkvL0Jhc2VsaW5lcyBpcyB0aGUgbGFzdCBiZWNhdXNlIGhhcyBtYXBwaW5ncyB0byB0aGUgb3RoZXIgbW9kZWxzDQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5QmFzZWxpbmVzKG5ld0JDKTsNCgkJCX0NCgkJCWVsc2Ugew0KCQkJCWlmIChhbGxPSykgYWxsT0s9Y29weUV2aWRlbmNlcygpOw0KCQkJCWlmIChhbGxPSykgYWxsT0s9Y29weUFyZ3VtZW50YXRpb25zKCk7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5UHJvY2Vzc2VzKCk7CQkJCQ0KCQkJfQ0KDQoJCQlpZihhbGxPSyl7DQoJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24obmV3IFNoZWxsKCksICJSZXVzZSBzdWNjZXNzIiwgIlNlbGVjdGVkIG1vZGVscyByZXVzZWQiKTsNCgkJCX0NCg0KCQl9IGNhdGNoIChFeGNlcHRpb24gY2RvZSkgew0KCQkJY2RvZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCQkNCgl9DQoJDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsJCQ0KCQlpZiAoIXRyYW5zYWN0aW9uQ0RPLmlzQ2xvc2VkKCkpIHsNCgkJCXRyYW5zYWN0aW9uQ0RPLmNsb3NlKCk7DQoJCX0NCgl9DQoJDQogICAgDQogICAgLyoqDQogICAgICogQ3JlYXRlIHRvb2xiYXIuDQogICAgICovDQogICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xiYXIoKSB7DQogICAgICAgICAgICBJVG9vbEJhck1hbmFnZXIgbWdyID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsNCiAgICAgICAgICAgIG1nci5hZGQoYWRkSXRlbUFjdGlvbik7DQogICAgfQ0KICAgIA0KICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7DQogICAgICAgIGFkZEl0ZW1BY3Rpb24gPSBuZXcgQWN0aW9uKCJSZWZyZXNoIikgew0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsgDQogICAgICAgICAgICAgICAgCXNldFByb2plY3REYXRhVG9Db21ibygpOw0KICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgfTsNCiAgICAgICAgYWRkSXRlbUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2VEZXNjcmlwdG9yKCJyZWZyZXNoLmdpZiIpKTsNCi8vICAgICAgICANCi8vICAgICAgICAvLyBBZGQgc2VsZWN0aW9uIGxpc3RlbmVyLg0KLy8gICAgICAgIHZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7DQovLyAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3Rpb25FbmE1NWJsZW1lbnQoKTsNCi8vICAgICAgICAgICAgICAgICAgIH0NCi8vICAgICAgICAgICB9KTsNCiAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIHJlbGF0aXZlIHBhdGguDQogICAgICovDQogICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsNCiAgICAgICAgICAgCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy8iOw0KICAgICAgICAgICAJUmV1c2VQbHVnaW4gcGx1Z2luID0gUmV1c2VQbHVnaW4uZ2V0RGVmYXVsdCgpOw0KICAgICAgICAgICAJSW1hZ2VEZXNjcmlwdG9yIGltZyA9IHBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaWNvblBhdGggKyByZWxhdGl2ZVBhdGgpOw0KICAgICAgICAgICAgcmV0dXJuIGltZzsNCiAgICB9DQogICAgDQogICAgcHJpdmF0ZSB2b2lkIHNldFByb2plY3REYXRhVG9Db21ibygpIHsNCiAgICAJc291cmNlUHJvamVjdENvbWJvLnJlbW92ZUFsbCgpOw0KICAgIAl0YXJnZXRQcm9qZWN0Q29tYm8ucmVtb3ZlQWxsKCk7DQogICAgCWNoZWNrdHJlZUJhc2VsaW5lU291cmNlLnNldElucHV0KG51bGwpOw0KICAgIAljaGVja3RyZWVQcm9jZXNzU291cmNlLnNldElucHV0KG51bGwpOw0KICAgIAljaGVja3RyZWVBcmdTb3VyY2Uuc2V0SW5wdXQobnVsbCk7DQogICAgCWNoZWNrdHJlZUV2aWRlbmNlU291cmNlLnNldElucHV0KG51bGwpOw0KICAgIAlyZXVzZUJ0bi5zZXRFbmFibGVkKGZhbHNlKTsNCgkJcHJvamVjdHM9ZmluZEFzc3VyYW5jZVByb2plY3RzKCk7DQoJCUl0ZXJhdG9yPENET1Jlc291cmNlTm9kZT4gaXRlcmF0b3IgPSBwcm9qZWN0cy5pdGVyYXRvcigpOw0KCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpew0KCQkJQ0RPUmVzb3VyY2VOb2RlIHByb2o9aXRlcmF0b3IubmV4dCgpOw0KCQkJU3RyaW5nIG5hbWU9cHJvai5nZXROYW1lKCk7DQoJCQlzb3VyY2VQcm9qZWN0Q29tYm8uYWRkKG5hbWUpOw0KCQkJaWYocHJvai5jZG9SZXZpc2lvbigpLmdldFBlcm1pc3Npb24oKS5pc1dyaXRhYmxlKCkpew0KCQkJCXRhcmdldFByb2plY3RDb21iby5hZGQobmFtZSk7DQoJCQl9DQoJCX0NCiAgICB9DQoJCQ0KfQ0KDQo=