LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNyBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC0yLjAvRVBMLTIuMC5odG1sDQogKg0KICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjANCiAqDQogKiBDb250cmlidXRvcnM6DQogKiAgIEh1YXNjYXIgRXNwaW5vemEgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgQWxlamFuZHJhIFJ17XogLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCiAqICAgSWRveWEgRGVsIFLtbyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBNYXJpIENhcm1lbiBQYWxhY2lvcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbmdlbCBM83BleiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKioNCiAqLw0KcGFja2FnZSBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLnJldXNlLnZpZXdzOw0KDQppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCmltcG9ydCBqYXZhLnV0aWwuTWFwOw0KaW1wb3J0IGphdmEudXRpbC5TZXQ7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLkNET09iamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmNvbW1vbi5pZC5DRE9JRDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmNvbW1vbi5zZWN1cml0eS5DRE9QZXJtaXNzaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uY29tbW9uLnV0aWwuQ0RPRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51aS5EYXduRWRpdG9ySW5wdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnV0aWwuY29ubmVjdGlvbi5DRE9Db25uZWN0aW9uVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZUZvbGRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmVyZXNvdXJjZS5DRE9SZXNvdXJjZU5vZGU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5zZXNzaW9uLkNET1Nlc3Npb247DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby50cmFuc2FjdGlvbi5DRE9UcmFuc2FjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnV0aWwuQ0RPVXRpbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5pbXBsLkRpYWdyYW1JbXBsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLmltcGwuU2hhcGVJbXBsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VyYW5jZWFzc2V0cy5hc3N1cmFuY2Vhc3NldC5Bc3N1cmFuY2VBc3NldEV2ZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3NldHNQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3N1cmFuY2VQcm9qZWN0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC5Bc3N1cmFuY2Vwcm9qZWN0RmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLmFzc3VyYW5jZXByb2plY3QuQXNzdXJhbmNlcHJvamVjdFBhY2thZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai5hc3N1cmFuY2Vwcm9qZWN0LkJhc2VsaW5lQ29uZmlnOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2ouYXNzdXJhbmNlcHJvamVjdC51dGlscy5EYXduQXJnRGlhZ3JhbVV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai51dGlscy53aWRnZXQuQ2hlY2tib3hUcmVlVmlld2VyRXh0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5iYXNlbGluZS5iYXNlbGluZS5CYXNlRnJhbWV3b3JrOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMuZXZpZGVuY2UuQXJ0ZWZhY3REZWZpbml0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5BcnRlZmFjdE1vZGVsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmV2bS5ldmlkc3BlYy5ldmlkZW5jZS5wcmVzZW50YXRpb24uRXZpZGVuY2VFZGl0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcucHJlc2VudGF0aW9uLkFyZ0VkaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYmFzZWxpbmUuYmFzZWxpbmUucHJlc2VudGF0aW9uLkJhc2VsaW5lRWRpdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnBhbS5wcm9jc3BlYy5wcm9jZXNzLnByZXNlbnRhdGlvbi5Qcm9jZXNzRWRpdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmluZnJhLm1hcHBpbmdzLm1hcHBpbmcuTWFwR3JvdXA7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuQWN0aXZpdHk7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuUGFydGljaXBhbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByb2Nlc3MuUHJvY2Vzc01vZGVsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkNhc2U7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQ2xhaW07DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuTW9kZWxFbGVtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7DQoNCg0KcHVibGljIGNsYXNzIFJldXNlQXNzaXN0YW5jZVZpZXcgZXh0ZW5kcyBWaWV3UGFydCB7DQoJLy8gTUNQIENyb3NzUHJvamVjdAkNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0RJQUdSQU0gPSAiX2RpYWdyYW0iOw0KCXByaXZhdGUgTWFwPFN0cmluZywgRU9iamVjdD4gZUlEVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVPYmplY3Q+KCk7IC8vIG9ubHkgZm9yIGFyZyBtb2RlbCBlbGVtZW50cw0KCS8vIE1DUCBDcm9zc1Byb2plY3QJDQoNCglwcm90ZWN0ZWQgQXJyYXlMaXN0PFN0cmluZz4gc1Jlc3VsdCA9IG51bGw7DQoJDQoJcHJpdmF0ZSBDRE9TZXNzaW9uIHNlc3Npb25DRE8gPSBudWxsOw0KCXByaXZhdGUgQ0RPUmVzb3VyY2UgcmVzb3VyY2VBUFNvdXJjZSA9IG51bGw7IAkJLy8gUmVzb3VyY2UgU291cmNlIEFzc3VyYW5jZSBwcm9qZWN0DQoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RTb3VyY2U7CS8vbW9kZWwgU291cmNlIEFzc3VyYW5jZSBwcm9qZWN0DQoJcHJpdmF0ZSBDRE9SZXNvdXJjZSByZXNvdXJjZUFQVGFyZ2V0ID0gbnVsbDsgDQoJcHJpdmF0ZSBBc3N1cmFuY2VQcm9qZWN0IGFzc3VyYW5jZVByb2plY3RUYXJnZXQ7Ly9tb2RlbCBUYXJnZXQgQXNzdXJhbmNlIHByb2plY3QNCgkNCglwcml2YXRlIENET1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uQ0RPID0gbnVsbDsNCgkNCglwcml2YXRlIE1hcDxDRE9SZXNvdXJjZSwgT2JqZWN0W10+IGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCXByaXZhdGUgTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4gYXJnQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCXByaXZhdGUgTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4gcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cyA9IG5ldyBIYXNoTWFwPENET1Jlc291cmNlLCBPYmplY3RbXT4oKTsNCglwcml2YXRlIE1hcDxDRE9SZXNvdXJjZSwgT2JqZWN0W10+IGJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzID0gbmV3IEhhc2hNYXA8Q0RPUmVzb3VyY2UsIE9iamVjdFtdPigpOw0KCQ0KCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNoZWNrdHJlZUJhc2VsaW5lU291cmNlOw0KCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyRXh0IGNoZWNrdHJlZUFyZ1NvdXJjZTsNCgkNCgkNCglwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlckV4dCBjaGVja3RyZWVQcm9jZXNzU291cmNlOw0KCQ0KCXByaXZhdGUgQ0RPUmVzb3VyY2UgYmFzZWxpbmVSZXNvdXJjZSA9IG51bGw7DQoJDQoJcHJpdmF0ZSBDb21ibyBzb3VyY2VQcm9qZWN0Q29tYm87DQoJcHJpdmF0ZSBMYWJlbCBzb3VyY2VMYWJlbDsNCglwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlckV4dCBjaGVja3RyZWVFdmlkZW5jZVNvdXJjZTsNCgkJCQ0KCXByaXZhdGUgTGFiZWwgdGFyZ2V0TGFiZWw7DQoJcHJpdmF0ZSBDb21ibyB0YXJnZXRQcm9qZWN0Q29tYm87DQoNCglwcml2YXRlICBNYXA8RU9iamVjdCwgRU9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsNCglIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7DQoNCglwcml2YXRlIEFzc2V0c1BhY2thZ2UgdGFyZ2V0QXNzZXRzUGFja2FnZTsNCgkNCglwcm90ZWN0ZWQgQXNzdXJhbmNlcHJvamVjdFBhY2thZ2UgcHJvamVjdFBhY2thZ2U7DQoJcHJvdGVjdGVkIEFzc3VyYW5jZXByb2plY3RGYWN0b3J5IHByb2plY3RGYWN0b3J5Ow0KCQ0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NVUkFOQ0VQUk9KRUNUID0gIi5hc3N1cmFuY2Vwcm9qZWN0IjsJDQoJDQoJcHJvdGVjdGVkIEJ1dHRvbiByZXVzZUJ0bjsNCglwcm90ZWN0ZWQgQXJyYXlMaXN0PENET1Jlc291cmNlTm9kZT4gcHJvamVjdHM7DQoJcHJvdGVjdGVkIFN0cmluZyBldmlFZGl0b3JJRCA9ICJvcmcuZWNsaXBzZS5vcGVuY2VydC5ldm0uZXZpZHNwZWMucHJlc2VudGF0aW9uLkRhd25FdmlkZW5jZUVkaXRvcklEIjsNCglwcm90ZWN0ZWQgU3RyaW5nIGFyZ0VkaXRvcklEID0gIm9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcucHJlc2VudGF0aW9uLkRhd25BcmdFZGl0b3JJRCI7DQoJcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzRWRpdG9ySUQgPSAib3JnLmVjbGlwc2Uub3BlbmNlcnQucGFtLnByb2NzcGVjLnByZXNlbnRhdGlvbi5EYXduUHJvY2Vzc0VkaXRvcklEIjsNCglwcm90ZWN0ZWQgU3RyaW5nIGJhc2VsaW5lRWRpdG9ySUQgPSAib3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmJhc2VsaW5lLnByZXNlbnRhdGlvbi5EYXduQmFzZWxpbmVFZGl0b3JJRCI7DQoJDQoJQWN0aW9uIGFkZEl0ZW1BY3Rpb247DQoNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQoJCQkJCSAgICANCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuaW5pdChQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJvdG9jb2woKSwNCgkJICAgICAgICAgIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0U2VydmVyTmFtZSgpKTsNCgkJDQoJCXNlc3Npb25DRE8gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZS5nZXRDdXJyZW50U2Vzc2lvbigpOw0KCQl0cmFuc2FjdGlvbkNETyA9IHNlc3Npb25DRE8ub3BlblRyYW5zYWN0aW9uKCk7DQoJCWNyZWF0ZUFjdGlvbnMoKTsNCgkJY3JlYXRlVG9vbGJhcigpOw0KCQljcmVhdGVSZXVzZUNvbnRyb2xzKHBhcmVudCk7DQoJCQ0KCX0JDQoJDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQoJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCgl9DQoNCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXVzZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCgkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KA0KCQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7DQoJCUNvbXBvc2l0ZSBzb3VyY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIHRydWUpOw0KCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOw0KCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJc291cmNlQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7DQoJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCgkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7DQoJCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwkJCQ0KCQlzb3VyY2VDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7DQoJCQ0KCQlDb21wb3NpdGUgY29tcG9zaXRlU291cmNlUHJvamVjdCA9IG5ldyBDb21wb3NpdGUoc291cmNlQ29tcG9zaXRlLCBTV1QuTk9ORSk7DQoJCUdyaWREYXRhIGRhdGFOZXcgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSk7DQoJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5FTkQ7DQoJCWNvbXBvc2l0ZVNvdXJjZVByb2plY3Quc2V0TGF5b3V0RGF0YShkYXRhTmV3KTsNCg0KCQlHcmlkTGF5b3V0IGxheW91dE5ldyA9IG5ldyBHcmlkTGF5b3V0KCk7DQoJCWRhdGFOZXcuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQlsYXlvdXROZXcubWFyZ2luSGVpZ2h0ID0gMDsNCgkJbGF5b3V0TmV3Lm1hcmdpbldpZHRoID0gMDsNCgkJbGF5b3V0TmV3Lm51bUNvbHVtbnMgPSAyOw0KCQljb21wb3NpdGVTb3VyY2VQcm9qZWN0LnNldExheW91dChsYXlvdXROZXcpOw0KCQkNCgkJLy8gTGFiZWwNCgkJdGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlU291cmNlUHJvamVjdCwgU1dULk5PTkUpOw0KCQl0YXJnZXRMYWJlbC5zZXRUZXh0KCJUYXJnZXQgUHJvamVjdDoiKTsNCgkJR3JpZERhdGEgdGFyZ2V0TGFiZWxHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwkJDQoJCXRhcmdldExhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQl0YXJnZXRMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7DQoJCXRhcmdldExhYmVsLnNldExheW91dERhdGEodGFyZ2V0TGFiZWxHcmlkRGF0YSk7DQoJCXRhcmdldFByb2plY3RDb21ibz1uZXcgQ29tYm8oY29tcG9zaXRlU291cmNlUHJvamVjdCxTV1QuTk9ORSk7DQoJCUdyaWREYXRhIHRhcmdldENvbWJvR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsJCQ0KCQl0YXJnZXRDb21ib0dyaWREYXRhLndpZHRoSGludD0yMDA7DQoJCXRhcmdldFByb2plY3RDb21iby5zZXRMYXlvdXREYXRhKHRhcmdldENvbWJvR3JpZERhdGEpOw0KCQ0KCQl0YXJnZXRQcm9qZWN0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQoJCQkJaW50IHRhcmdldGluZGV4PXRhcmdldFByb2plY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOw0KCQkJCUNET1Jlc291cmNlTm9kZSBzZWxlY3RlZFRhcmdldD1wcm9qZWN0cy5nZXQodGFyZ2V0aW5kZXgpOw0KCQkJCXRyeSB7CQ0KCQkJCQlyZXNvdXJjZUFQVGFyZ2V0PSB0cmFuc2FjdGlvbkNETy5nZXRSZXNvdXJjZShzZWxlY3RlZFRhcmdldC5nZXRQYXRoKCkpOw0KCQkJCQlhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0PSAoQXNzdXJhbmNlUHJvamVjdCkgcmVzb3VyY2VBUFRhcmdldC5nZXRDb250ZW50cygpLmdldCgwKTsNCgkJCQkJaWYoc291cmNlUHJvamVjdENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk+LTEpew0KCQkJCQkJcmV1c2VCdG4uc2V0RW5hYmxlZCh0cnVlKTsNCgkJCQkJfQ0KCQkJCQkJDQoJCQkJfSBjYXRjaCAoQ0RPRXhjZXB0aW9uIGNkb2UpIHsNCgkJCQkJY2RvZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJCQl9DQoJCQl9DQoJCX0pOw0KCQkNCi8vCQkvLyBUZXh0DQovLwkJcHJvamVjdHRhcmdldFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuTk9ORSk7DQoJCUdyaWREYXRhIG5hbWVUZXh0R3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsNCgkJbmFtZVRleHRHcmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCgkJbmFtZVRleHRHcmlkRGF0YS5taW5pbXVtV2lkdGggPSA1MDsNCgkJbmFtZVRleHRHcmlkRGF0YS53aWR0aEhpbnQ9MTAwOw0KCQluYW1lVGV4dEdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsNCgkJbmFtZVRleHRHcmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQ0KCQkvLyBMYWJlbA0KCQlzb3VyY2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuTk9ORSk7DQoJCXNvdXJjZUxhYmVsLnNldFRleHQoIlNvdXJjZSBQcm9qZWN0OiIpOw0KCQlHcmlkRGF0YSBzb3VyY2VMYWJlbEdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7DQoJCXNvdXJjZUxhYmVsR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQlzb3VyY2VMYWJlbEdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7DQoJCXNvdXJjZUxhYmVsLnNldExheW91dERhdGEoc291cmNlTGFiZWxHcmlkRGF0YSk7DQoJCXNvdXJjZVByb2plY3RDb21ibz1uZXcgQ29tYm8oY29tcG9zaXRlU291cmNlUHJvamVjdCxTV1QuTk9ORSk7CQ0KCQkNCgkJR3JpZERhdGEgc291cmNlQ29tYm9HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwkJDQoJCXNvdXJjZUNvbWJvR3JpZERhdGEud2lkdGhIaW50PTIwMDsNCgkJc291cmNlUHJvamVjdENvbWJvLnNldExheW91dERhdGEoc291cmNlQ29tYm9HcmlkRGF0YSk7DQoJCQ0KCQlzb3VyY2VQcm9qZWN0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQoJCQkJc291cmNlUHJvamVjdENoYW5nZWQoKTsNCgkJCX0NCgkJCQ0KCQl9KTsNCgkJDQoJCS8vTG9hZCB0aGUgYmFzZWxpbmUNCgkJR3JpZERhdGEgbW9kZWxWaWV3ZXJHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KCQltb2RlbFZpZXdlckdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7DQoJCW1vZGVsVmlld2VyR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOw0KCQltb2RlbFZpZXdlckdyaWREYXRhLndpZHRoSGludCA9IDIwMDsNCgkJbW9kZWxWaWV3ZXJHcmlkRGF0YS5ob3Jpem9udGFsU3Bhbj0yOw0KCQltb2RlbFZpZXdlckdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOw0KCQltb2RlbFZpZXdlckdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCgkJDQoJCWNoZWNrdHJlZUJhc2VsaW5lU291cmNlID0gbmV3IENoZWNrYm94VHJlZVZpZXdlckV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LA0KCQkJCVNXVC5OT05FIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7DQoJCQ0KCQljaGVja3RyZWVCYXNlbGluZVNvdXJjZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShtb2RlbFZpZXdlckdyaWREYXRhKTsNCgkJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2Uuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigNCgkJCQlhZGFwdGVyRmFjdG9yeSkpOw0KCQljaGVja3RyZWVCYXNlbGluZVNvdXJjZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoDQoJCQkJYWRhcHRlckZhY3RvcnkpKTsNCg0KCQljaGVja3RyZWVCYXNlbGluZVNvdXJjZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpew0KDQoJCQlAT3ZlcnJpZGUNCgkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsNCgkJCQlPYmplY3Qgb2JqPSgoVHJlZVNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7DQoJCQkJaWYob2JqIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2Upew0KCQkJCQlVUkkgdXJpPSgoQ0RPUmVzb3VyY2Upb2JqKS5nZXRVUkkoKTsNCgkJCQkJU3RyaW5nIGVkaXRvcklEID0gYmFzZWxpbmVFZGl0b3JJRDsNCgkJCSAgICAgICAgDQoJCQkgICAgICAgICAgaWYgKGVkaXRvcklEICE9IG51bGwgJiYgIWVkaXRvcklELmVxdWFscygiIikpDQoJCQkgICAgICAgICAgew0KCQkJICAgICAgICAgICAgdHJ5DQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIERhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCSAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkgICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgICBCYXNlbGluZUVkaXRvciBiYXNlbGluZUVkaXRvciA9IChCYXNlbGluZUVkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCSAgICAgICAgICAgICAgYm9vbGVhbiByZXNldENoZWNrcyA9IGZhbHNlOw0KCQkJICAgICAgICAgICAgICBpZiAoYmFzZWxpbmVFZGl0b3I9PW51bGwpIHsNCgkJCSAgICAgICAgICAgIAkgIHJlc2V0Q2hlY2tzID10cnVlOw0KCQkJICAgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9ySUQpOw0KCQkJICAgICAgICAgICAgICBiYXNlbGluZUVkaXRvciA9IChCYXNlbGluZUVkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCQkJCSAgYmFzZWxpbmVFZGl0b3Iuc2V0QWN0aXZlUGFnZVB1YmxpYyg1KTsNCgkJCQkJCSAgYm9vbGVhbiBzdGF0dXMgPSBjaGVja3RyZWVCYXNlbGluZVNvdXJjZS5nZXRDaGVja2VkKG9iaik7DQoJCQkJCQkgIGlmIChyZXNldENoZWNrcz09dHJ1ZSkgew0KCQkJCQkJCSAgIGJhc2VsaW5lRWRpdG9yLnNldFRyZWVWaWV3ZXJXaXRoQ2hlY2soc3RhdHVzKTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpDQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgfQ0KCQkJCQkvL1N0cmluZyB0ZXh0PWkuZ2V0VGV4dCgpOw0KCQkJCX0NCgkJCQkNCgkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQoJCQkJDQoJCQl9DQoJCQkNCgkJfSk7CQkNCg0KCQkvLyBUcmVlVmlld2VyIGZvciBBcnRlZmFjdCBtb2RlbHMNCgkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyRXh0KGNvbXBvc2l0ZVNvdXJjZVByb2plY3QsIFNXVC5TSU5HTEUNCgkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQkJCQ0KCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShtb2RlbFZpZXdlckdyaWREYXRhKTsNCgkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2Uuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCgkNCi8vCQljaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5nZXRUcmVlKCkuc2V0RW5hYmxlZChmYWxzZSk7DQoNCgkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsNCg0KCQkJQE92ZXJyaWRlDQoJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7DQoJCQkJT2JqZWN0IG9iaj0oKFRyZWVTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOw0KCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENET1Jlc291cmNlKXsNCgkJCQkJVVJJIHVyaT0oKENET1Jlc291cmNlKW9iaikuZ2V0VVJJKCk7DQoJCQkJCVN0cmluZyBlZGl0b3JJRCA9IGV2aUVkaXRvcklEOw0KCQkJICAgICAgICANCgkJCSAgICAgICAgICBpZiAoZWRpdG9ySUQgIT0gbnVsbCAmJiAhZWRpdG9ySUQuZXF1YWxzKCIiKSkNCgkJCSAgICAgICAgICB7DQoJCQkgICAgICAgICAgICB0cnkNCgkJCSAgICAgICAgICAgIHsNCgkJCSAgICAgICAgICAgICAgRGF3bkVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IERhd25FZGl0b3JJbnB1dCh1cmkpOw0KCQkJICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsJCSAgICAgICAgICAgICAgDQoJCQkgICAgICAgICAgICAgIEV2aWRlbmNlRWRpdG9yIGV2aUVkaXRvciA9IChFdmlkZW5jZUVkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCSAgICAgICAgICAgICAgDQoJCQkgICAgICAgICAgICAgDQoJCQkgICAgICAgICAgICAgIGJvb2xlYW4gcmVzZXRDaGVja3MgPSBmYWxzZTsNCgkJCSAgICAgICAgICAgICAgaWYgKGV2aUVkaXRvcj09bnVsbCkgew0KCQkJICAgICAgICAgICAgCSAgcmVzZXRDaGVja3MgPXRydWU7DQoJCQkgICAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgICAgcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJRCk7DQoJCQkgICAgICAgICAgICAgIGV2aUVkaXRvciA9IChFdmlkZW5jZUVkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCQkJCSAgZXZpRWRpdG9yLnNldEFjdGl2ZVBhZ2VQdWJsaWMoNSk7DQoJCQkJCQkgIGJvb2xlYW4gc3RhdHVzID0gY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZ2V0Q2hlY2tlZChvYmopOw0KCQkJCQkJICBpZiAocmVzZXRDaGVja3M9PXRydWUpIHsNCgkJCQkJCQkgICBldmlFZGl0b3Iuc2V0VHJlZVZpZXdlcldpdGhDaGVjayhzdGF0dXMpOw0KCQkJICAgICAgICAgICAgICB9DQoJCQkJCQkgIGV2aUVkaXRvci5zZXRCYXNlbGluZVJlc291cmNlKGJhc2VsaW5lUmVzb3VyY2UpOw0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpDQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgfQ0KCQkJCQkvL1N0cmluZyB0ZXh0PWkuZ2V0VGV4dCgpOw0KCQkJCX0NCgkJCQkNCgkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQoJCQkJDQoJCQl9DQoJCQkNCgkJfSk7DQoNCgkJLy8gVHJlZVZpZXdlciBmb3IgQXJndW1lbnRhdGlvbiBtb2RlbHMNCgkJY2hlY2t0cmVlQXJnU291cmNlID0gbmV3IENoZWNrYm94VHJlZVZpZXdlckV4dChjb21wb3NpdGVTb3VyY2VQcm9qZWN0LCBTV1QuU0lOR0xFDQoJCQkJfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCgkJCQkNCgkJY2hlY2t0cmVlQXJnU291cmNlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG1vZGVsVmlld2VyR3JpZERhdGEpOw0KCQljaGVja3RyZWVBcmdTb3VyY2Uuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOw0KCQljaGVja3RyZWVBcmdTb3VyY2Uuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7DQoJCQ0KCQljaGVja3RyZWVBcmdTb3VyY2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsNCg0KCQkJQE92ZXJyaWRlDQoJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7DQoJCQkJT2JqZWN0IG9iaj0oKFRyZWVTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOw0KCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENET1Jlc291cmNlKXsNCgkJCQkJVVJJIHVyaT0oKENET1Jlc291cmNlKW9iaikuZ2V0VVJJKCk7DQoJCQkJCVN0cmluZyBlZGl0b3JJRCA9IGFyZ0VkaXRvcklEOw0KCQkJICAgICAgICANCgkJCSAgICAgICAgICBpZiAoZWRpdG9ySUQgIT0gbnVsbCAmJiAhZWRpdG9ySUQuZXF1YWxzKCIiKSkNCgkJCSAgICAgICAgICB7DQoJCQkgICAgICAgICAgICB0cnkNCgkJCSAgICAgICAgICAgIHsNCgkJCSAgICAgICAgICAgICAgRGF3bkVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IERhd25FZGl0b3JJbnB1dCh1cmkpOw0KCQkJICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsJCSAgICAgICAgICAgICAgDQoJCQkgICAgICAgICAgICAgIEFyZ0VkaXRvciBhcmdFZGl0b3IgPSAoQXJnRWRpdG9yKSBwYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpOw0KCQkJICAgICAgICAgICAgICBib29sZWFuIHJlc2V0Q2hlY2tzID0gZmFsc2U7DQoJCQkgICAgICAgICAgICAgIGlmIChhcmdFZGl0b3I9PW51bGwpIHsNCgkJCSAgICAgICAgICAgIAkgIHJlc2V0Q2hlY2tzID10cnVlOw0KCQkJICAgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9ySUQpOw0KCQkJICAgICAgICAgICAgICBhcmdFZGl0b3IgPSAoQXJnRWRpdG9yKSBwYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpOw0KCQkJCQkJICBhcmdFZGl0b3Iuc2V0QWN0aXZlUGFnZVB1YmxpYyg1KTsNCgkJCQkJCSAgDQoJCQkJCQkgIGJvb2xlYW4gc3RhdHVzID0gY2hlY2t0cmVlQXJnU291cmNlLmdldENoZWNrZWQob2JqKTsNCgkJCQkJCSAgaWYgKHJlc2V0Q2hlY2tzPT10cnVlKSB7DQoJCQkJCQkJICAgYXJnRWRpdG9yLnNldFRyZWVWaWV3ZXJXaXRoQ2hlY2soc3RhdHVzKTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpDQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgfQ0KCQkJCQkvL1N0cmluZyB0ZXh0PWkuZ2V0VGV4dCgpOw0KCQkJCX0NCgkJCQkNCgkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQoJCQkJDQoJCQl9DQoJCQkNCgkJfSk7DQoJCQkJDQoJCS8vIFRyZWVWaWV3ZXIgZm9yIFByb2Nlc3MgbW9kZWxzDQoJCWNoZWNrdHJlZVByb2Nlc3NTb3VyY2UgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyRXh0KGNvbXBvc2l0ZVNvdXJjZVByb2plY3QsIFNXVC5TSU5HTEUNCgkJCQl8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOw0KCQkJCQ0KCQljaGVja3RyZWVQcm9jZXNzU291cmNlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG1vZGVsVmlld2VyR3JpZERhdGEpOw0KCQljaGVja3RyZWVQcm9jZXNzU291cmNlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCgkJY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsNCgkJDQoJCWNoZWNrdHJlZVByb2Nlc3NTb3VyY2UuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKXsNCg0KCQkJQE92ZXJyaWRlDQoJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7DQoJCQkJT2JqZWN0IG9iaj0oKFRyZWVTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOw0KCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENET1Jlc291cmNlKXsNCgkJCQkJVVJJIHVyaT0oKENET1Jlc291cmNlKW9iaikuZ2V0VVJJKCk7DQoJCQkJCVN0cmluZyBlZGl0b3JJRCA9IHByb2Nlc3NFZGl0b3JJRDsNCgkJCSAgICAgICAgDQoJCQkgICAgICAgICAgaWYgKGVkaXRvcklEICE9IG51bGwgJiYgIWVkaXRvcklELmVxdWFscygiIikpDQoJCQkgICAgICAgICAgew0KCQkJICAgICAgICAgICAgdHJ5DQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIERhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCSAgICAgICAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkgICAgICAgICAgICAgIA0KCQkJICAgICAgICAgICAgICBQcm9jZXNzRWRpdG9yIHByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCSAgICAgICAgICAgICAgYm9vbGVhbiByZXNldENoZWNrcyA9IGZhbHNlOw0KCQkJICAgICAgICAgICAgICBpZiAocHJvY2Vzc0VkaXRvcj09bnVsbCkgew0KCQkJICAgICAgICAgICAgCSAgcmVzZXRDaGVja3MgPXRydWU7DQoJCQkgICAgICAgICAgICAgIH0NCgkJCSAgICAgICAgICAgICAgcGFnZS5vcGVuRWRpdG9yKGVkaXRvcklucHV0LCBlZGl0b3JJRCk7DQoJCQkgICAgICAgICAgICAgIHByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkJCQkJCSAgcHJvY2Vzc0VkaXRvci5zZXRBY3RpdmVQYWdlUHVibGljKDUpOw0KCQkJCQkJICBib29sZWFuIHN0YXR1cyA9IGNoZWNrdHJlZVByb2Nlc3NTb3VyY2UuZ2V0Q2hlY2tlZChvYmopOw0KCQkJCQkJICBpZiAocmVzZXRDaGVja3M9PXRydWUpIHsNCgkJCQkJCQkgICBwcm9jZXNzRWRpdG9yLnNldFRyZWVWaWV3ZXJXaXRoQ2hlY2soc3RhdHVzKTsNCgkJCSAgICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgfQ0KCQkJICAgICAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpDQoJCQkgICAgICAgICAgICB7DQoJCQkgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkgICAgICAgICAgICB9DQoJCQkgICAgICAgICAgfQ0KCQkJCQkvL1N0cmluZyB0ZXh0PWkuZ2V0VGV4dCgpOw0KCQkJCX0NCgkJCQkNCgkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQoJCQkJDQoJCQl9DQoJCQkNCgkJfSk7DQoJCQkJCQkNCgkJDQoJCS8vY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZS5nZXRUcmVlKCkuc2V0RW5hYmxlZChmYWxzZSk7IC8vSHVhc2NhciB0byBlbmFibGUgYWxsIHRoZSBsaXN0cw0KDQoJCXJldXNlQnRuID0gbmV3IEJ1dHRvbiAoc291cmNlQ29tcG9zaXRlLCBTV1QuUFVTSCk7DQoJICAgIHJldXNlQnRuLnNldFRleHQoIlJldXNlIik7DQoJICAgIHJldXNlQnRuLnNldEVuYWJsZWQoZmFsc2UpOw0KCSAgICANCgkJR3JpZERhdGEgb2tHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwkJDQoJCW9rR3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5SSUdIVDsNCgkJcmV1c2VCdG4uc2V0TGF5b3V0RGF0YShva0dyaWREYXRhKTsNCgkJDQoJICAgIHJldXNlQnRuLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KCQkJCWV4ZWN1dGVSZXVzZSgpOw0KCQkJfQ0KCSAgICB9KTsJDQoJICAgIA0KCQlzZXRQcm9qZWN0RGF0YVRvQ29tYm8oKTsNCgkgICAgDQoJfQ0KCXB1YmxpYyB2b2lkIENyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KFRyZWVWaWV3ZXIgdHJlZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsNCg0KCQl0cnkgew0KCQkJdHJlZS5zZXRJbnB1dChyZXNvdXJjZVNldCk7DQoJCQkNCgkJCWZpbmFsIFZpZXdlckZpbHRlciBtb2RlbEZpbHRlciA9IG5ldyBWaWV3ZXJGaWx0ZXIoKSB7DQoJCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LA0KCQkJCQkJT2JqZWN0IGVsZW1lbnQpIHsNCgkJCQkJDQoJCQkJCS8vaWYgKHNFbGVtZW50RmlsdGVyLmNvbnRlbnRFcXVhbHMoIkFydGVmYWN0IikpIHsNCgkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ0RPUmVzb3VyY2UpIHsNCgkJCQkJCQlyZXR1cm4gdHJ1ZTsJCQkJCQkNCgkJCQkJCX0NCi8vCQkJCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENET1Jlc291cmNlTm9kZSkgew0KLy8JCQkJCQkJcmV0dXJuIHRydWU7CQkJCQkJDQovLwkJCQkJCX0NCgkJCQkJCWVsc2Ugew0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJCQkNCgkJCQkJLy99IGVsc2UNCgkJCQkJLy8JcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX07DQoJCQl0cmVlLmFkZEZpbHRlcihtb2RlbEZpbHRlcik7DQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KCQkJTWVzc2FnZURpYWxvZw0KCQkJCQkub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiTm90IHZhbGlkIG1vZGVsIGZpbGUiLA0KCQkJCQkJCSJUaGUgcHJvdmlkZWQgbW9kZWwgZmlsZSBjb3VsZG4ndCBiZSBwYXJzZWQgYXMgYW4gRU1GIHJlc291cmNlIik7DQoJCQl0cmVlLnNldElucHV0KG51bGwpOw0KCQl9DQoJfQ0KCXByaXZhdGUgYm9vbGVhbiBjb3B5TWFwcygpIHsNCgkJU3RyaW5nIHNvdXJjZVBhdGg9IHJlc291cmNlQVBTb3VyY2UuZ2V0UGF0aCgpOw0KCQlTdHJpbmcgW10gcGF0aFBhcnRzPSBzb3VyY2VQYXRoLnNwbGl0KCIvIik7DQoJCVN0cmluZyBwcm9qZWN0Rm9sZGVyPXBhdGhQYXJ0c1sxXSsgIi8iICsgcGF0aFBhcnRzWzJdIDsNCgkJDQoJCUNET1Jlc291cmNlRm9sZGVyIGZvbGRlciA9IHRyYW5zYWN0aW9uQ0RPLmdldFJlc291cmNlRm9sZGVyKHByb2plY3RGb2xkZXIpOw0KCQlFTGlzdCA8Q0RPUmVzb3VyY2VOb2RlPiBjb250ZW50cz1udWxsOw0KCQlpZihmb2xkZXIgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZUZvbGRlcil7DQoJCQljb250ZW50cz0gKChDRE9SZXNvdXJjZUZvbGRlcilmb2xkZXIpLmdldE5vZGVzKCk7CQkJDQoJCX0NCgkJDQoJCWZvcihpbnQgeD0wO3g8Y29udGVudHMuc2l6ZSgpO3grKyl7DQoJCQlDRE9SZXNvdXJjZU5vZGUgb25lTm9kZSAgPSBjb250ZW50cy5nZXQoeCk7DQoJCQlpZihvbmVOb2RlIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2Upew0KCQkJCWlmKG9uZU5vZGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCJtYXBwaW5nIikpew0KCQkJCQlDRE9SZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSAgPSAoQ0RPUmVzb3VyY2Upb25lTm9kZTsNCgkJCQkJU3RyaW5nIHByb2plY3RQYXRoPSByZXNvdXJjZUFQVGFyZ2V0LmdldFBhdGgoKTsNCgkJCQkJcGF0aFBhcnRzPSBwcm9qZWN0UGF0aC5zcGxpdCgiLyIpOw0KCQkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMV0rICIvIiArIHBhdGhQYXJ0c1syXSArIi8iICsgb25lTm9kZS5nZXROYW1lKCk7DQoJCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCQkJCUNET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IHRyYW5zYWN0aW9uQ0RPLmNyZWF0ZVJlc291cmNlKHRhcmdldFBhdGgpOw0KCQkJCQkNCgkJCQkJaW5pdENvcHkoc291cmNlUmVzb3VyY2UsIHRhcmdldFJlc291cmNlLCBudWxsKTsNCg0KCQkJCQl0cnkgewkJCQkNCgkJCQkJCXRhcmdldFJlc291cmNlLnNhdmUob3B0aW9ucyk7CQkJCQkJDQoJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQoJCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIk1hcHBpbmcgcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0KDQoJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCQkJCQkNCgkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJCQl0cmFuc2FjdGlvbkNETy5yb2xsYmFjaygpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQ0KCQ0KCXByaXZhdGUgYm9vbGVhbiBjb3B5QmFzZWxpbmVzKEJhc2VsaW5lQ29uZmlnIGJjb25maWdBY3RpdmUpIHsNCgkJQXJyYXlMaXN0PE9iamVjdD4gYWxsT2JqZWN0cyA9bnVsbDsNCgkJDQoJCWJvb2xlYW4gaXNNb2RlbENoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCQkJCQ0KCQlmb3IgKCBFT2JqZWN0IGtleSA6IGJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJQ0RPUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgID0gKENET1Jlc291cmNlKWtleTsNCgkJCWJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgbnVsbCk7DQoJCQlpc01vZGVsQ2hlY2tlZCA9IGNoZWNrdHJlZUJhc2VsaW5lU291cmNlLmdldENoZWNrZWQoa2V5KTsNCgkJCWlmIChpc01vZGVsQ2hlY2tlZCkgew0KCQkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCB0cmVlVmlldyA9IG51bGw7DQoJCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbnVsbDsNCgkJCQkNCgkJCQlVUkkgdXJpPXNvdXJjZVJlc291cmNlLmdldFVSSSgpOw0KCQkJCURhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCgkJCQlCYXNlbGluZUVkaXRvciBlZGl0b3IgPSAoQmFzZWxpbmVFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7DQoJICAgICAgICAgICAgCXRyZWVWaWV3ID0gZWRpdG9yLmdldFRyZWVWaWV3ZXJXaXRoQ2hlY2soKTsNCgkgICAgICAgICAgICB9DQoJCQkJDQoJCQkJaWYgKHRyZWVWaWV3IT1udWxsKSB7DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IHRyZWVWaWV3LmdldENoZWNrZWRFbGVtZW50cygpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWFsbE9iamVjdHM9IG5ldyBBcnJheUxpc3QoKTsNCgkJCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvciA9IHNvdXJjZVJlc291cmNlLmdldEFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCgkJCQkJCUVPYmplY3QgYUVPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7DQoJCQkJCQlhbGxPYmplY3RzLmFkZChhRU9iamVjdCk7DQoJCQkJCX0NCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gYWxsT2JqZWN0cy50b0FycmF5KCk7DQoJCQkJfQ0KCQkJCWJhc2VsaW5lQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQlTdHJpbmcgcHJvamVjdFBhdGg9IHJlc291cmNlQVBUYXJnZXQuZ2V0UGF0aCgpOw0KCQkJCVN0cmluZyBbXSBwYXRoUGFydHM9IHByb2plY3RQYXRoLnNwbGl0KCIvIik7DQoNCgkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMV0rICIvIiArIHBhdGhQYXJ0c1syXSArIi8iICsgc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpOw0KCQ0KCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCQkJDQoJCQkJQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gdHJhbnNhY3Rpb25DRE8uY3JlYXRlUmVzb3VyY2UodGFyZ2V0UGF0aCk7DQoJCQkJLy9kaWFncmFtUmVzb3VyY2UgID0gdHJhbnNhY3Rpb24uZ2V0T3JDcmVhdGVSZXNvdXJjZShhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmdldFBhdGgoKSArICIvIiArIGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmVfZGlhZ3JhbSIpOw0KCQkJCS8vVG8gY29weSB0aGUgcmVmZnJhbWV3b3JrIGFzIGJhc2VsaW5lDQoJCQkJLy9NQ1BDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmFkZFJlc291cmNlKGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmUiKTsNCgkNCgkJCQlpbml0Q29weShzb3VyY2VSZXNvdXJjZSwgdGFyZ2V0UmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7DQoJDQoJCQkJdHJ5IHsJCQkJDQoJCQkJCXRhcmdldFJlc291cmNlLnNhdmUob3B0aW9ucyk7DQoJCQkJCQ0KCQkJCQliY29uZmlnQWN0aXZlLmdldFJlZkZyYW1ld29yaygpLmFkZCgoQmFzZUZyYW1ld29yaykgdGFyZ2V0UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOw0KCQkJCQkNCgkJCQkJcmVzb3VyY2VBUFRhcmdldC5zYXZlKG9wdGlvbnMpOwkJCQkNCgkNCgkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiQmFzZWxpbmUgcmV1c2UgZmFpbGVkIiwgIkVycm9yIGNvcHlpbmcgbW9kZWwgIiArIHRhcmdldFBhdGgpOw0KCQ0KCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCQkJCQkNCgkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJCQkJdHJhbnNhY3Rpb25DRE8ucm9sbGJhY2soKTsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoJDQoJcHJpdmF0ZSBib29sZWFuIGNvcHlFdmlkZW5jZXMoKSB7DQoJCUFycmF5TGlzdDxPYmplY3Q+IGFsbE9iamVjdHMgPW51bGw7DQoJCQ0KCQlib29sZWFuIGlzTW9kZWxDaGVja2VkID0gZmFsc2U7DQoNCgkJZm9yICggRU9iamVjdCBrZXkgOiBldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCUNET1Jlc291cmNlIHNvdXJjZVJlc291cmNlICA9IChDRE9SZXNvdXJjZSlrZXk7DQoJCQlldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5wdXQoc291cmNlUmVzb3VyY2UsIG51bGwpOw0KCQkJaXNNb2RlbENoZWNrZWQgPSBjaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5nZXRDaGVja2VkKGtleSk7DQoJCQlpZiAoaXNNb2RlbENoZWNrZWQpIHsNCgkJCQlDaGVja2JveFRyZWVWaWV3ZXJFeHQgdHJlZVZpZXcgPSBudWxsOw0KCQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG51bGw7DQoJCQkJDQoJCQkJVVJJIHVyaT1zb3VyY2VSZXNvdXJjZS5nZXRVUkkoKTsNCgkJCQlEYXduRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgRGF3bkVkaXRvcklucHV0KHVyaSk7DQoJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQoJCQkJRXZpZGVuY2VFZGl0b3IgZWRpdG9yID0gKEV2aWRlbmNlRWRpdG9yKSBwYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpOw0KCSAgICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkgew0KCSAgICAgICAgICAgIAl0cmVlVmlldyA9IGVkaXRvci5nZXRUcmVlVmlld2VyV2l0aENoZWNrKCk7CSAgICAgICAgICAgIAkJICAgICAgICAgICAgCQ0KCSAgICAgICAgICAgIH0NCgkJCQkNCgkJCQlpZiAodHJlZVZpZXchPW51bGwpIHsNCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gdHJlZVZpZXcuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJYWxsT2JqZWN0cz0gbmV3IEFycmF5TGlzdCgpOw0KCQkJCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yID0gc291cmNlUmVzb3VyY2UuZ2V0QWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KCQkJCQkJRU9iamVjdCBhRU9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsNCgkJCQkJCWFsbE9iamVjdHMuYWRkKGFFT2JqZWN0KTsNCgkJCQkJfQ0KCQkJCQlzZWxlY3RlZE9iamVjdHMgPSBhbGxPYmplY3RzLnRvQXJyYXkoKTsNCgkJCQl9DQoJCQkJZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMucHV0KHNvdXJjZVJlc291cmNlLCBzZWxlY3RlZE9iamVjdHMpOw0KCQkJCVN0cmluZyBwcm9qZWN0UGF0aD0gcmVzb3VyY2VBUFRhcmdldC5nZXRQYXRoKCk7DQoJCQkJU3RyaW5nIFtdIHBhdGhQYXJ0cz0gcHJvamVjdFBhdGguc3BsaXQoIi8iKTsNCgkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMV0rICIvIiArICJFVklERU5DRS8iICsgc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpOw0KCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCQkJQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gdHJhbnNhY3Rpb25DRE8uY3JlYXRlUmVzb3VyY2UodGFyZ2V0UGF0aCk7DQoJCQkJDQoJCQkJLy9kaWFncmFtUmVzb3VyY2UgID0gdHJhbnNhY3Rpb24uZ2V0T3JDcmVhdGVSZXNvdXJjZShhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmdldFBhdGgoKSArICIvIiArIGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmVfZGlhZ3JhbSIpOw0KCQkJCS8vVG8gY29weSB0aGUgcmVmZnJhbWV3b3JrIGFzIGJhc2VsaW5lDQoJCQkJLy9NQ1BDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmFkZFJlc291cmNlKGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmUiKTsNCg0KCQkJCWluaXRDb3B5KHNvdXJjZVJlc291cmNlLCB0YXJnZXRSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCg0KCQkJCXRyeSB7CQkNCgkJCQkJDQoJCQkJCXRhcmdldFJlc291cmNlLnNhdmUob3B0aW9ucyk7DQoJCQkJCXRhcmdldEFzc2V0c1BhY2thZ2UuZ2V0QXJ0ZWZhY3RzTW9kZWwoKS5hZGQoKEFydGVmYWN0TW9kZWwpIHRhcmdldFJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApKTsNCgkJCQkJcmVzb3VyY2VBUFRhcmdldC5zYXZlKG9wdGlvbnMpOw0KCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobmV3IFNoZWxsKCksICJFdmlkZW5jZSByZXVzZSBmYWlsZWQiLCAiRXJyb3IgY29weWluZyBtb2RlbCAiICsgdGFyZ2V0UGF0aCk7DQoNCgkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawkJCQkJDQoJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJCXRyYW5zYWN0aW9uQ0RPLnJvbGxiYWNrKCk7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoJCQkNCgkJCQkJCQ0KCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU5vdEV4aXN0aW5nTmFtZShTdHJpbmcgdGFyZ2V0UGF0aCkgew0KCQkNCgkJaWYodHJhbnNhY3Rpb25DRE8uaGFzUmVzb3VyY2UodGFyZ2V0UGF0aCkpew0KCQkJU3RyaW5nIFtdIHRva2Vucz0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOw0KCQkJDQoJCQlTdHJpbmcgW10gbmFtZVRva2VzID0gdG9rZW5zWzJdLnNwbGl0KCJcXC4iKTsJCQkNCgkJCS8vQ2hhbmdlIG9ubHkgdGhlIG5hbWUNCgkJCVN0cmluZyBtb2RlbE5hbWUgPSBuYW1lVG9rZXNbMF07DQoJCQlTdHJpbmcgbW9kZWxUeXBlID0gbmFtZVRva2VzWzFdOw0KCQkJY2hhciBsYXN0Y2hhciA9IG1vZGVsTmFtZS5jaGFyQXQobW9kZWxOYW1lLmxlbmd0aCgpLTEpOw0KCQkJY2hhciBwcmV2bGFzdGNoYXIgPSBtb2RlbE5hbWUuY2hhckF0KG1vZGVsTmFtZS5sZW5ndGgoKS0yKTsNCgkJCQ0KCQkJaWYoQ2hhcmFjdGVyLmlzRGlnaXQocHJldmxhc3RjaGFyKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdChsYXN0Y2hhcikpew0KCQkJCWludCBudW1iZXI9IEludGVnZXIucGFyc2VJbnQoIiIgKyBwcmV2bGFzdGNoYXIgKyBsYXN0Y2hhcik7DQoJCQkJbnVtYmVyKys7DQoJCQkJbW9kZWxOYW1lPW1vZGVsTmFtZS5zdWJzdHJpbmcoMCwgbW9kZWxOYW1lLmxlbmd0aCgpLTIpICsgbnVtYmVyOw0KCQkJfQ0KCQkJZWxzZSBpZihDaGFyYWN0ZXIuaXNEaWdpdChsYXN0Y2hhcikpew0KCQkJCWludCBudW1iZXI9IEludGVnZXIucGFyc2VJbnQoIiIgKyBsYXN0Y2hhcik7DQoJCQkJbnVtYmVyKys7DQoJCQkJbW9kZWxOYW1lPW1vZGVsTmFtZS5zdWJzdHJpbmcoMCwgbW9kZWxOYW1lLmxlbmd0aCgpLTEpICsgbnVtYmVyOw0KCQkJfQ0KCQkJZWxzZXsNCgkJCQltb2RlbE5hbWU9bW9kZWxOYW1lICsgIjEiOw0KCQkJfQ0KCQkJDQoJCQl0YXJnZXRQYXRoPXRva2Vuc1swXSsgIi8iICsgdG9rZW5zWzFdICsgIi8iICsgbW9kZWxOYW1lICsgIi4iICsgbW9kZWxUeXBlOw0KCQkJDQoJCQkvL0NoZWNrIGFnYWluIHRoZSBuZXcgbmFtZQ0KCQkJdGFyZ2V0UGF0aD1jcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCX0NCgkJcmV0dXJuIHRhcmdldFBhdGg7DQoJfQ0KDQoJLy8gTUNQIENyb3NzUHJvamVjdA0KCXByaXZhdGUgTGlzdDxDRE9SZXNvdXJjZT4gZ2V0RGlhZ3JhbXNGcm9tTW9kZWwoQ0RPUmVzb3VyY2UgbW9kZWxDRE8pIHsNCgkJTGlzdDxDRE9SZXNvdXJjZT4gcmVzID0gbmV3IEFycmF5TGlzdDxDRE9SZXNvdXJjZT4oKTsNCgkJDQoJCS8qIE5vIGZ1bmNpb25hIHBvcnF1ZSBsb3MgZGlhZ3JhbWFzIG5vIGVzdOFuIGNhcmdhZG9zIGVuIG1lbW9yaWEgbyBlcyBxdWUgc/NsbyBmdW5jaW9uYSBjb24gbW9kZWxvcw0KCQlFT2JqZWN0IGFFT2JqZWN0PSBtb2RlbENETy5nZXRDb250ZW50cygpLmdldCgwKTsNCgkJTGlzdDxDRE9PYmplY3RSZWZlcmVuY2U+IHJjID0gdHJhbnNhY3Rpb24ucXVlcnlYUmVmcyhDRE9VdGlsLmdldENET09iamVjdChhRU9iamVjdCksIG5ldyBFUmVmZXJlbmNlW10ge30pOw0KCQlmb3IoQ0RPT2JqZWN0UmVmZXJlbmNlIG9uZVJlZjpyYyl7DQoJCQlpZiAob25lUmVmLmdldFNvdXJjZU9iamVjdCgpLmVSZXNvdXJjZSgpICE9IG1vZGVsQ0RPKSByZXMuYWRkKChDRE9SZXNvdXJjZSkob25lUmVmLmdldFNvdXJjZU9iamVjdCgpLmVSZXNvdXJjZSgpKSk7DQoJCQlpZiAob25lUmVmLmdldFRhcmdldE9iamVjdCgpLmVSZXNvdXJjZSgpICE9IG1vZGVsQ0RPKSByZXMuYWRkKChDRE9SZXNvdXJjZSkob25lUmVmLmdldFRhcmdldE9iamVjdCgpLmVSZXNvdXJjZSgpKSk7DQoJCX0NCgkJTGlzdDxFT2JqZWN0PiBsaXN0ID0gYUVPYmplY3QuZUNyb3NzUmVmZXJlbmNlcygpOw0KCQlmb3IoRU9iamVjdCBlbGVtIDogbGlzdCkNCgkJew0KCQkJcmVzLmFkZCgoQ0RPUmVzb3VyY2UpZWxlbS5lUmVzb3VyY2UoKSk7DQoJCX0NCgkJKi8NCgkJU3RyaW5nIHRlbXAgPSBtb2RlbENETy5nZXRQYXRoKCk7DQoJCVN0cmluZyBzb3VyY2VGb2xkZXJQYXRoID0gdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sYXN0SW5kZXhPZigiLyIpKTsNCgkJQ0RPUmVzb3VyY2VGb2xkZXIgYXJnRm9sZGVyPXRyYW5zYWN0aW9uQ0RPLmdldFJlc291cmNlRm9sZGVyKHNvdXJjZUZvbGRlclBhdGgpOw0KCQlFTGlzdDxDRE9SZXNvdXJjZU5vZGU+IGxpc3ROID0gYXJnRm9sZGVyLmdldE5vZGVzKCk7DQoJCWZvciAoIENET1Jlc291cmNlTm9kZSBub2RlIDogbGlzdE4pIHsNCgkJCWlmIChub2RlIGluc3RhbmNlb2YgQ0RPUmVzb3VyY2VGb2xkZXIpIHsNCgkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImdldERpYWdyYW1zRnJvbU1vZGVsOiBmb3VuZCBzdWJmb2xkZXIgPS4iKyBub2RlLnRvU3RyaW5nKCkpOw0KCQkJCUxpc3Q8Q0RPUmVzb3VyY2U+IHJlczIgPSBnZXREaWFncmFtc0Zyb21Nb2RlbCgoQ0RPUmVzb3VyY2UpIG5vZGUpOw0KCQkJCXJlcy5hZGRBbGwocmVzMik7DQoJCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZSkgewkJCQkJDQoJCQkJQ0RPUmVzb3VyY2UgZWxlbSA9IChDRE9SZXNvdXJjZSlub2RlOw0KCQkJCWlmKGVsZW0uZ2V0UGF0aCgpLmNvbnRhaW5zKEVYVEVOU0lPTl9ESUFHUkFNKSl7DQoJCQkJCUVPYmplY3QgbW9kZWwgPSAoRU9iamVjdCkgKChEaWFncmFtSW1wbCllbGVtLmdldENvbnRlbnRzKCkuZ2V0KDApKS5iYXNpY0dldEVsZW1lbnQoKTsNCgkJCQkJLy9pZiAoZWxlbS5nZXRDb250ZW50cygpLmdldCgwKS5lUmVzb3VyY2UoKSA9PSBtb2RlbENETykNCgkJCQkJaWYgKG1vZGVsLmVSZXNvdXJjZSgpLmdldFVSSSgpID09IG1vZGVsQ0RPLmdldFVSSSgpKQ0KCQkJCQl7DQoJCQkJCQlyZXMuYWRkKChDRE9SZXNvdXJjZSllbGVtLmdldENvbnRlbnRzKCkuZ2V0KDApLmVSZXNvdXJjZSgpKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCS8vbGlzdE4ucmVtb3ZlKDApOyBNRSBEQSBQUk9CTEVNQVMgUE9SUVVFIEVTVE9ZIEJPUlJBTkRPISEhDQoJCX0NCgkJDQoJCXJldHVybiByZXM7DQoJfQ0KCS8vIE1DUCBDcm9zc1Byb2plY3QNCgkNCglwcml2YXRlIGJvb2xlYW4gY29weUFyZ3VtZW50YXRpb25zKCkgew0KCQlBcnJheUxpc3Q8T2JqZWN0PiBhbGxPYmplY3RzID1udWxsOw0KCQkNCgkJYm9vbGVhbiBpc01vZGVsQ2hlY2tlZCA9IGZhbHNlOw0KCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0DQoJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG51bGw7DQoJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKG5ldyBTaGVsbCgpKTsNCgkJLy8gTUNQIENyb3NzUHJvamVjdA0KCQkNCgkJZm9yICggRU9iamVjdCBrZXkgOiBhcmdBbGxTZWxlY3RlZE9iamVjdHMua2V5U2V0KCkgKSB7DQoJCQlDRE9SZXNvdXJjZSBzb3VyY2VSZXNvdXJjZSAgPSAoQ0RPUmVzb3VyY2Upa2V5Ow0KCQkJYXJnQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgbnVsbCk7DQoJCQlpc01vZGVsQ2hlY2tlZCA9IGNoZWNrdHJlZUFyZ1NvdXJjZS5nZXRDaGVja2VkKGtleSk7DQoJCQkNCgkJCS8vIE1DUCBDcm9zc1Byb2plY3QNCgkJCWRpYWxvZy5vcGVuKCk7DQoJCQltb25pdG9yID0gZGlhbG9nLmdldFByb2dyZXNzTW9uaXRvcigpOw0KCQkJCVN0cmluZyBDUkVBVEVfQVJHX0RJQUdSQU0gPSAiQ3JlYXRlIENyb3NzIEFyZyBkaWFncmFtIjsNCgkJCQltb25pdG9yLmJlZ2luVGFzayhDUkVBVEVfQVJHX0RJQUdSQU0sIDIwKTsNCgkJCS8vIE1DUCBDcm9zc1Byb2plY3QJDQoJCQkNCgkJCWlmIChpc01vZGVsQ2hlY2tlZCkgew0KCQkJCUNoZWNrYm94VHJlZVZpZXdlckV4dCB0cmVlVmlldyA9IG51bGw7DQoJCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbnVsbDsNCgkJCQkNCgkJCQlVUkkgdXJpPXNvdXJjZVJlc291cmNlLmdldFVSSSgpOw0KCQkJCURhd25FZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBEYXduRWRpdG9ySW5wdXQodXJpKTsNCgkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQ0KCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsNCgkJCQlBcmdFZGl0b3IgZWRpdG9yID0gKEFyZ0VkaXRvcikgcGFnZS5maW5kRWRpdG9yKGVkaXRvcklucHV0KTsNCgkgICAgICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsNCgkgICAgICAgICAgICAJdHJlZVZpZXcgPSBlZGl0b3IuZ2V0VHJlZVZpZXdlcldpdGhDaGVjaygpOw0KCSAgICAgICAgICAgIH0NCgkJCQkNCgkJCQlpZiAodHJlZVZpZXchPW51bGwpIHsNCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gdHJlZVZpZXcuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJYWxsT2JqZWN0cz0gbmV3IEFycmF5TGlzdCgpOw0KCQkJCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yID0gc291cmNlUmVzb3VyY2UuZ2V0QWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KCQkJCQkJRU9iamVjdCBhRU9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsNCgkJCQkJCWFsbE9iamVjdHMuYWRkKGFFT2JqZWN0KTsNCgkJCQkJfQ0KCQkJCQlzZWxlY3RlZE9iamVjdHMgPSBhbGxPYmplY3RzLnRvQXJyYXkoKTsNCgkJCQl9DQoJCQkJYXJnQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQlTdHJpbmcgcHJvamVjdFBhdGg9IHJlc291cmNlQVBUYXJnZXQuZ2V0UGF0aCgpOw0KCQkJCVN0cmluZyBbXSBwYXRoUGFydHM9IHByb2plY3RQYXRoLnNwbGl0KCIvIik7DQoNCgkJCQlTdHJpbmcgdGFyZ2V0UGF0aD1wYXRoUGFydHNbMV0rICIvIiArICJBUkdVTUVOVEFUSU9OLyIgKyBzb3VyY2VSZXNvdXJjZS5nZXROYW1lKCk7DQkJCQlTdHJpbmcgdGFyZ2V0Rm9sZGVyUGF0aD1wYXRoUGFydHNbMV0rICIvIiArICJBUkdVTUVOVEFUSU9OIjsNCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQkJCQlDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSB0cmFuc2FjdGlvbkNETy5jcmVhdGVSZXNvdXJjZSh0YXJnZXRQYXRoKTsNCQkJCS8vZGlhZ3JhbVJlc291cmNlICA9IHRyYW5zYWN0aW9uLmdldE9yQ3JlYXRlUmVzb3VyY2UoYXNzdXJhbmNlcHJvamVjdEZvbGRlci5nZXRQYXRoKCkgKyAiLyIgKyBiYXNlbGluZU5hbWUgKyAiLmJhc2VsaW5lX2RpYWdyYW0iKTsNCQkJCS8vVG8gY29weSB0aGUgcmVmZnJhbWV3b3JrIGFzIGJhc2VsaW5lDQkJCQkvL01DUENET1Jlc291cmNlIHRhcmdldFJlc291cmNlICA9IGFzc3VyYW5jZXByb2plY3RGb2xkZXIuYWRkUmVzb3VyY2UoYmFzZWxpbmVOYW1lICsgIi5iYXNlbGluZSIpOw0NCgkJCQlpbml0Q29weShzb3VyY2VSZXNvdXJjZSwgdGFyZ2V0UmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7DQkJCgkJCQl0cnkgewkJCQkNCQkJCQl0YXJnZXRSZXNvdXJjZS5zYXZlKG9wdGlvbnMpOw0JCQkJCS8vIE1DUCBDcm9zc1Byb2plY3QNCQkJCQkvLyBjcmVhciBsb3MgZGlhZ3JhbWFzIGRlbCBtb2RlbG8NCQkJCQkvL1N0cmluZyBzb3VyY2VEaWFncmFtPSBzb3VyY2VSZXNvdXJjZS5nZXRQYXRoKCkgKyAiX2RpYWdyYW0iOw0JCQkJCS8vQ0RPUmVzb3VyY2Ugc291cmNlRGlhZ3JhbVJlc291cmNlICA9IHRyYW5zYWN0aW9uLmdldE9yQ3JlYXRlUmVzb3VyY2Uoc291cmNlRGlhZ3JhbSk7DQkJCQkJTGlzdDxDRE9SZXNvdXJjZT4gbGlzdERpYWdyYW1zID0gZ2V0RGlhZ3JhbXNGcm9tTW9kZWwoc291cmNlUmVzb3VyY2UpOw0JCQkJCWZvcihDRE9SZXNvdXJjZSBzb3VyY2VEaWFncmFtUmVzb3VyY2U6IGxpc3REaWFncmFtcykNCQkJCQl7DQkJCQkJCS8vIGxpc3RhIGRlIG9iamV0b3MgZW4gZGlhZ3JhbWENCQkJCQkJLy9MaXN0PEVPYmplY3Q+IGxpc3RSb290T2JqZWN0cyA9IHNvdXJjZURpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpOw0JCQkJCQlMaXN0PEVPYmplY3Q+IGxpc3RSb290T2JqZWN0c1NvdXJjZSA9ICgoRGlhZ3JhbSlzb3VyY2VEaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpLmdldFBlcnNpc3RlZENoaWxkcmVuKCk7DQkJCQkJCUxpc3Q8RU9iamVjdD4gbGlzdFJvb3RPYmplY3RzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOw0JCQkJCQlmb3IoRU9iamVjdCBlbGVtZW50IDogbGlzdFJvb3RPYmplY3RzU291cmNlKQ0JCQkJCQl7DQkJCQkJCQlFT2JqZWN0IG9ianNvdXJjZSA9ICgoU2hhcGVJbXBsKWVsZW1lbnQpLmdldEVsZW1lbnQoKTsNCQkJCQkJCS8vRU9iamVjdCBvYmogPSBtYXAuZ2V0KG9ianNvdXJjZSk7DQkJCQkJICAgICAgICBDRE9JRCBjZG9JRCA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KG9ianNvdXJjZSkuY2RvSUQoKTsNCQkJCQkJCUVPYmplY3Qgb2JqID0gZUlEVG9PYmplY3RNYXAuZ2V0KGNkb0lELnRvU3RyaW5nKCkpOw0JCQkJCQkJbGlzdFJvb3RPYmplY3RzLmFkZChvYmopOw0JCQkJCQl9DQkJCQkJCS8vIGNyZWFyIGVsIHJlY3Vyc28gZGlhZ3JhbSB2YWNpbw0JCQkJCQlDRE9SZXNvdXJjZUZvbGRlciBhcmdGb2xkZXI9dHJhbnNhY3Rpb25DRE8uZ2V0UmVzb3VyY2VGb2xkZXIodGFyZ2V0Rm9sZGVyUGF0aCk7CQkJCQkKCQkJCQkJLy9DRE9SZXNvdXJjZUZvbGRlciBhcmdGb2xkZXI9cHJvamVjdEZvbGRlci5hZGRSZXNvdXJjZUZvbGRlcigiQVJHVU1FTlRBVElPTiIpOw0JCQkJICAgICAgICAvL0NET1Jlc291cmNlIHRhcmdldERpYWdyYW1SZXNvdXJjZSAgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKHRhcmdldFBhdGggKyBFWFRFTlNJT05fRElBR1JBTSk7DQkJCQkJCVN0cmluZyB0YXJnZXREaWFncmFtID0gdGFyZ2V0UGF0aC5zdWJzdHJpbmcoMCwgdGFyZ2V0UGF0aC5sYXN0SW5kZXhPZigiLyIpICsgMSkgKyBzb3VyY2VEaWFncmFtUmVzb3VyY2UuZ2V0TmFtZSgpOw0JCQkJCQl0YXJnZXREaWFncmFtID0gY3JlYXRlTm90RXhpc3RpbmdOYW1lKHRhcmdldERpYWdyYW0pOw0JCQkJCQlDRE9SZXNvdXJjZSB0YXJnZXREaWFncmFtUmVzb3VyY2UgID0gdHJhbnNhY3Rpb25DRE8uZ2V0T3JDcmVhdGVSZXNvdXJjZSh0YXJnZXREaWFncmFtKTsNCQkJCQkJRGF3bkFyZ0RpYWdyYW1VdGlsIG15RGlhZ3JhbSA9IG5ldyBEYXduQXJnRGlhZ3JhbVV0aWwoc291cmNlRGlhZ3JhbVJlc291cmNlLCBsaXN0Um9vdE9iamVjdHMsIHRhcmdldFJlc291cmNlLmdldFVSSSgpLCB0YXJnZXREaWFncmFtUmVzb3VyY2UuZ2V0VVJJKCksIGFyZ0ZvbGRlciwgdHJhbnNhY3Rpb25DRE8pOw0JCQkJCQlteURpYWdyYW0uZ2VuZXJhdGVEaWFncmFtKG1vbml0b3IpOw0JCQkJCX0NCQkJCQkvL01DUDogc2UgbGFuemEgTG9jYWxDb21taXRDb25mbGljdEV4Y2VwdGlvbiEhITsgbG9zIGFudGVyaW9yZXMgY29tbWl0IHNvbiBzaW4gcGFyYW1ldHJvIHBlcm8gc2lndWUgZWwgcHJvYmxlbWENCQkJCQlTZXQ8Q0RPT2JqZWN0PiBjb25mID0gdHJhbnNhY3Rpb25DRE8uZ2V0Q29uZmxpY3RzKCk7DQkJCQkJZm9yIChJdGVyYXRvcjxDRE9PYmplY3Q+aXQgPSBjb25mLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCQkJCQkJQ0RPT2JqZWN0IG5leHRPYmplY3QgPSBpdC5uZXh0KCk7DQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29weUFyZ3VtZW50YXRpb25zOiBjb25maWN0ICIrbmV4dE9iamVjdC50b1N0cmluZygpKTsNCQkJCQl9DQkJCQkJdHJhbnNhY3Rpb25DRE8uY29tbWl0KCk7Ly8/Pz9NQ1ANCQkJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0DQkJCQkJdGFyZ2V0QXNzZXRzUGFja2FnZS5nZXRBcmd1bWVudGF0aW9uTW9kZWwoKS5hZGQoKENhc2UpIHRhcmdldFJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApKTsNCQkJCQlyZXNvdXJjZUFQVGFyZ2V0LnNhdmUob3B0aW9ucyk7DQkJCQkJLy8gTUNQIENyb3NzUHJvamVjdA0JCQkJCS8vPz8/dHJhbnNhY3Rpb24uY2xvc2UoKTsNCQkJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0CQkJDQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiQXJndW1lbnRhdGlvbiByZXVzZSBmYWlsZWQiLCAiRXJyb3IgY29weWluZyBtb2RlbCAiICsgdGFyZ2V0UGF0aCk7DQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawkJCQkJDQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCQkJCQl0cmFuc2FjdGlvbkNETy5yb2xsYmFjaygpOw0JCQkJCWRpYWxvZy5jbG9zZSgpOwoJCQkJCXJldHVybiBmYWxzZTsNCQkJCX0NCgkJCX0NCgkJCWRpYWxvZy5jbG9zZSgpOw0KCQl9Ly8gY3ljbGUgZm9yDQoJCQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9CSANCgkJCQ0KCQ0KCXByaXZhdGUgYm9vbGVhbiBjb3B5UHJvY2Vzc2VzKCkgew0KCQlBcnJheUxpc3Q8T2JqZWN0PiBhbGxPYmplY3RzID1udWxsOw0KCQkNCgkJYm9vbGVhbiBpc01vZGVsQ2hlY2tlZCA9IGZhbHNlOw0KDQoJCWZvciAoIEVPYmplY3Qga2V5IDogcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCUNET1Jlc291cmNlIHNvdXJjZVJlc291cmNlICA9IChDRE9SZXNvdXJjZSlrZXk7DQoJCQlwcm9jZXNzQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChzb3VyY2VSZXNvdXJjZSwgbnVsbCk7DQoJCQlpc01vZGVsQ2hlY2tlZCA9IGNoZWNrdHJlZVByb2Nlc3NTb3VyY2UuZ2V0Q2hlY2tlZChrZXkpOw0KCQkJaWYgKGlzTW9kZWxDaGVja2VkKSB7DQoJCQkJQ2hlY2tib3hUcmVlVmlld2VyRXh0IHRyZWVWaWV3ID0gbnVsbDsNCgkJCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBudWxsOw0KCQkJCQ0KCQkJCVVSSSB1cmk9c291cmNlUmVzb3VyY2UuZ2V0VVJJKCk7DQoJCQkJRGF3bkVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IERhd25FZGl0b3JJbnB1dCh1cmkpOw0KCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQoJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOw0KCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhZ2UuZmluZEVkaXRvcihlZGl0b3JJbnB1dCk7DQoJICAgICAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsKSB7DQoJICAgICAgICAgICAgCXRyZWVWaWV3ID0gZWRpdG9yLmdldFRyZWVWaWV3ZXJXaXRoQ2hlY2soKTsNCgkgICAgICAgICAgICB9DQoJICAgICAgICAgICAgDQoJCQkJaWYgKHRyZWVWaWV3IT1udWxsKSB7DQoJCQkJCXNlbGVjdGVkT2JqZWN0cyA9IHRyZWVWaWV3LmdldENoZWNrZWRFbGVtZW50cygpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWFsbE9iamVjdHM9IG5ldyBBcnJheUxpc3QoKTsNCgkJCQkJZm9yIChJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvciA9IHNvdXJjZVJlc291cmNlLmdldEFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCgkJCQkJCUVPYmplY3QgYUVPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7DQoJCQkJCQlhbGxPYmplY3RzLmFkZChhRU9iamVjdCk7DQoJCQkJCX0NCgkJCQkJc2VsZWN0ZWRPYmplY3RzID0gYWxsT2JqZWN0cy50b0FycmF5KCk7DQoJCQkJfQ0KCQkJCXByb2Nlc3NBbGxTZWxlY3RlZE9iamVjdHMucHV0KHNvdXJjZVJlc291cmNlLCBzZWxlY3RlZE9iamVjdHMpOw0KCQkJCVN0cmluZyBwcm9qZWN0UGF0aD0gcmVzb3VyY2VBUFRhcmdldC5nZXRQYXRoKCk7DQoJCQkJU3RyaW5nIFtdIHBhdGhQYXJ0cz0gcHJvamVjdFBhdGguc3BsaXQoIi8iKTsNCg0KCQkJCVN0cmluZyB0YXJnZXRQYXRoPXBhdGhQYXJ0c1sxXSsgIi8iICsgIlBST0NFU1NFUy8iICsgc291cmNlUmVzb3VyY2UuZ2V0TmFtZSgpOw0KCQkJCXRhcmdldFBhdGggPSBjcmVhdGVOb3RFeGlzdGluZ05hbWUodGFyZ2V0UGF0aCk7DQoJCQkJQ0RPUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2UgID0gdHJhbnNhY3Rpb25DRE8uY3JlYXRlUmVzb3VyY2UodGFyZ2V0UGF0aCk7DQoJCQkJLy9kaWFncmFtUmVzb3VyY2UgID0gdHJhbnNhY3Rpb24uZ2V0T3JDcmVhdGVSZXNvdXJjZShhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmdldFBhdGgoKSArICIvIiArIGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmVfZGlhZ3JhbSIpOw0KCQkJCS8vVG8gY29weSB0aGUgcmVmZnJhbWV3b3JrIGFzIGJhc2VsaW5lDQoJCQkJLy9NQ1BDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSAgPSBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLmFkZFJlc291cmNlKGJhc2VsaW5lTmFtZSArICIuYmFzZWxpbmUiKTsNCgkNCgkJCQlpbml0Q29weShzb3VyY2VSZXNvdXJjZSwgdGFyZ2V0UmVzb3VyY2UsIHNlbGVjdGVkT2JqZWN0cyk7CQkJICAgIA0KDQoJCQkJdHJ5IHsJCQkJDQoJCQkJCXRhcmdldFJlc291cmNlLnNhdmUob3B0aW9ucyk7DQoJCQkJCQ0KCQkJCQl0YXJnZXRBc3NldHNQYWNrYWdlLmdldFByb2Nlc3NNb2RlbCgpLmFkZCgoUHJvY2Vzc01vZGVsKSB0YXJnZXRSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKSk7DQoJCQkJCXJlc291cmNlQVBUYXJnZXQuc2F2ZShvcHRpb25zKTsNCgkNCgkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQoJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKG5ldyBTaGVsbCgpLCAiUHJvY2VzcyByZXVzZSBmYWlsZWQiLCAiRXJyb3IgY29weWluZyBtb2RlbCAiICsgdGFyZ2V0UGF0aCk7DQoJDQoJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCgkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJCQkJdHJhbnNhY3Rpb25DRE8ucm9sbGJhY2soKTsNCgkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCX0NCgkJCX0JDQoJCX0NCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoJcHJpdmF0ZSB2b2lkIGluaXRDb3B5KENET1Jlc291cmNlIHNvdXJjZVJlc291cmNlLCBDRE9SZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSwgT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzKSB7DQoJCS8vIENyZWF0ZSBlbXB0eSByb290cw0KCQlib29sZWFuIG9iakNoZWNrZWQgPSBmYWxzZTsNCgkJZm9yIChFT2JqZWN0IGFFT2JqZWN0IDogc291cmNlUmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgew0KCQkJdGFyZ2V0UmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoYUVPYmplY3QpKTsNCgkJfQ0KDQoJCS8vIENvcHkgRU9iamVjdHMsIGNvbnRhaW5tZW50IGluIHRoZSByZXNvdXJjZSBpcyBkb25lIGF1dG9tYXRpY2FsbHkgc2luY2Ugd2UgaGF2ZQ0KCQkvLyBhbHJlYWR5IGF0dGFjaGVkIHRoZSBjb3JyZXNwb25kaW5nIHJvb3QgRU9iamVjdCB0byB0aGUgdGFyZ2V0IHJlc291cmNlDQoJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3IgPSBzb3VyY2VSZXNvdXJjZS5nZXRBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQoJCQlFT2JqZWN0IGFFT2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOw0KCQkJDQoJCQkvL0F2b2lkIGNvcHkgYXNzdXJhbmNlIGFzc2VudCBldmVudHMNCgkJCWlmKGFFT2JqZWN0IGluc3RhbmNlb2YgQXNzdXJhbmNlQXNzZXRFdmVudCl7DQoJCQkJY29udGludWU7DQoJCQl9DQoJCQkNCgkJCWlmKHNlbGVjdGVkT2JqZWN0cyE9bnVsbCl7DQoJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhRU9iamVjdCwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQlpZiAob2JqQ2hlY2tlZD09ZmFsc2UpIHsNCgkJCQkJICBjb250aW51ZTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCUVPYmplY3QgYkVPYmplY3QgPSBnZXRDb3JyZXNwb25kaW5nRU9iamVjdChhRU9iamVjdCk7DQoNCgkJCWNvcHlBRU9iamVjdFRvQkVPYmplY3QoYUVPYmplY3QsIGJFT2JqZWN0LCBzZWxlY3RlZE9iamVjdHMpOw0KDQoJCQkvLyBNQ1AgQ3Jvc3NQcm9qZWN0CQkJDQoJCQlpZihhRU9iamVjdCBpbnN0YW5jZW9mIE1vZGVsRWxlbWVudCkNCgkJCXsNCgkJICAgICAgICBDRE9JRCBjZG9JRCA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGFFT2JqZWN0KS5jZG9JRCgpOw0KCQkgICAgICAgIExvbmcgIGNkb0lkTG9uZyA9IG5ldyBMb25nKGNkb0lELnRvVVJJRnJhZ21lbnQoKSk7DQoJCQkJZUlEVG9PYmplY3RNYXAucHV0KGNkb0lELnRvU3RyaW5nKCksIGJFT2JqZWN0KTsNCgkJCX0NCgkJCS8vIE1DUCBDcm9zc1Byb2plY3QJCQkNCgkJfQ0KCX0JDQoJDQoJcHJpdmF0ZSBib29sZWFuIGV4aXN0T2JqZWN0KE9iamVjdCBzZWFyY2hlZE9iaiwgT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzKXsNCgkJYm9vbGVhbiBleGlzdCA9IGZhbHNlOw0KCQlmb3IoT2JqZWN0IGVsZW1lbnQ6IHNlbGVjdGVkT2JqZWN0cyl7DQoJCQlpZiAoZWxlbWVudC50b1N0cmluZygpLmVxdWFscyhzZWFyY2hlZE9iai50b1N0cmluZygpKSkgew0KCQkJCWV4aXN0ID0gdHJ1ZTsNCgkJCQkvL3NlbGVjdGVkT2JqZWN0cz0gQXJyYXlVdGlscy5yZW1vdmVFbGVtZW50KHNlbGVjdGVkT2JqZWN0cyxlbGVtZW50KTsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZXhpc3Q7DQoJfQ0KCQ0KCXByaXZhdGUgIEVPYmplY3QgZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoRU9iamVjdCBhRU9iamVjdCkgew0KCQkNCgkJRU9iamVjdCBiRU9iamVjdCA9IG1hcC5nZXQoYUVPYmplY3QpOwkJCQ0KCQlpZiAoYkVPYmplY3QgPT0gbnVsbCkgewkJCQ0KCQkJaWYoYUVPYmplY3QgaW5zdGFuY2VvZiBNYXBHcm91cCl7DQoJCQkJZm9yICggRU9iamVjdCBrZXkgOiBtYXAua2V5U2V0KCkgKSB7DQoJCQkJICAgaWYoa2V5IGluc3RhbmNlb2YgTWFwR3JvdXApew0KCQkJCQkgICBpZihDRE9VdGlsLmdldENET09iamVjdChrZXkpLmNkb0lEKCkgPT0gQ0RPVXRpbC5nZXRDRE9PYmplY3QoYUVPYmplY3QpLmNkb0lEKCkpew0KCQkJCQkJICAgcmV0dXJuIG1hcC5nZXQoa2V5KTsNCgkJCQkJICAgfQ0KCQkJCSAgIH0NCgkJCQl9DQoJCQl9DQoJCQkNCgkJCUVDbGFzcyBhRUNsYXNzID0gYUVPYmplY3QuZUNsYXNzKCk7CQkJDQoJCQkvL2lmKGFFQ2xhc3MuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIlJlZiIpKXsNCgkJCQ0KCQkJCS8vU3RyaW5nIGJDbGFzc05hbWUgPSBhRUNsYXNzLmdldE5hbWUoKS5yZXBsYWNlRmlyc3QoIlJlZiIsICJCYXNlIik7DQoJCQkJLy8gU2Vjb25kIHNlYXJjaCB0aGUgY29ycmVzcG9uZGluZyBFQ2xhc3MgaW4gQlBhY2thZ2UNCgkJCQkvL0VDbGFzcyBiRUNsYXNzID0gKEVDbGFzcykgQmFzZWxpbmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQ2xhc3NpZmllcihiQ2xhc3NOYW1lKTsNCgkJCQkvLyBDcmVhdGUgYSBuZXcgZW1wdHkgaW5zdGFuY2UgYW5kIHJlZ2lzdGVyIHRvIGF2b2lkIGR1cHMNCgkJCQliRU9iamVjdCA9IEVjb3JlVXRpbC5jcmVhdGUoYUVDbGFzcyk7DQoJCQkJbWFwLnB1dChhRU9iamVjdCwgYkVPYmplY3QpOw0KCQkJLy99DQoJCQkgLyppZiAoYUVDbGFzcy5nZXROYW1lKCkuZXF1YWxzKCJNYXBKdXN0aWZpY2F0aW9uIikpew0KCQkJCWJFT2JqZWN0ID0gRWNvcmVVdGlsLmNyZWF0ZShhRUNsYXNzKTsNCgkJCQltYXAucHV0KGFFT2JqZWN0LCBiRU9iamVjdCk7DQoJCQl9DQoJCQllbHNlIGlmIChhRUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoIk1hcEdyb3VwIikpew0KCQkJCWJFT2JqZWN0ID0gRWNvcmVVdGlsLmNyZWF0ZShhRUNsYXNzKTsNCgkJCQltYXAucHV0KGFFT2JqZWN0LCBiRU9iamVjdCk7DQoJCQl9DQoJCQllbHNleyovDQoJCQkJLy9iRU9iamVjdD1hRU9iamVjdDsNCgkJCQkvL21hcC5wdXQoYUVPYmplY3QsIGFFT2JqZWN0KTsNCgkJCS8vfQ0KCQl9DQoJCXJldHVybiBiRU9iamVjdDsNCgl9DQoJDQoJcHJpdmF0ZSAgdm9pZCBjb3B5QUVPYmplY3RUb0JFT2JqZWN0KEVPYmplY3QgYUVPYmplY3QsIEVPYmplY3QgYkVPYmplY3QsIE9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cykgew0KCQlib29sZWFuIG9iakNoZWNrZWQgPSBmYWxzZTsNCgkJZm9yIChFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUgOiBhRU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkpIHsNCgkJCWlmIChhRU9iamVjdC5lSXNTZXQoYUZlYXR1cmUpKSB7DQoJCQkJLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUgaW4gdGhlIHRhcmdldCBFQ2xhc3MuDQoJCQkJLy8gR2V0IHNpbXBseSB0aGUgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIG5hbWUNCgkJCQkNCgkJCQlFU3RydWN0dXJhbEZlYXR1cmUgYkZlYXR1cmUgPSBiRU9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoYUZlYXR1cmUuZ2V0TmFtZSgpKTsJCQkJCQkJCQ0KCQkJCQ0KCQkJCWlmKGJGZWF0dXJlICE9IG51bGwpew0KCQkJCQlpZiAoYUZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7DQoJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCX0gZWxzZSB7IC8vIEVSZWZlcmVuY2UNCgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQlpZihhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJCYXNlRXF1aXZhbGVuY2VNYXAiKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJ0YXJnZXQiKSApew0KCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSBpZihhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJyZWZGcmFtZXdvcmsiKSB8fCBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJyZWZBc3N1cmFibGVFbGVtZW50Iikpew0KCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSBpZihhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJCYXNlQ29tcGxpYW5jZU1hcCIpICYmIGFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInRhcmdldCIpICl7DQoJCQkJCQkJaWYoYUVPYmplY3QuZUdldChhRmVhdHVyZSkgaW5zdGFuY2VvZiBFTGlzdCl7DQoJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCQkJCQkJCQlFTGlzdDxFT2JqZWN0PiBhTGlzdCA9IChFTGlzdDxFT2JqZWN0PikgYUVPYmplY3QuZUdldChhRmVhdHVyZSk7DQoJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGJMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsgDQoJCQkJCQkJCWJvb2xlYW4gaGFzRWxlbWVudHMgPSBmYWxzZTsNCgkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgew0KCQkJCQkJCQkJaWYgKChhTGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBBcnRlZmFjdCkgfHwgKGFMaXN0LmdldChpKSBpbnN0YW5jZW9mIEFydGVmYWN0RGVmaW5pdGlvbikpIHsNCgkJCQkJCQkJCQlvYmpDaGVja2VkID0gZmFsc2U7DQoJCQkJCQkJCQkJZm9yICggRU9iamVjdCBrZXkgOiBldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCQkJCQkJCQkJaWYoZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkhPW51bGwpew0KCQkJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGV4aXN0T2JqZWN0KGFMaXN0LmdldChpKSwgZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkpOw0KCQkJCQkJCQkJCQkJaWYgKG9iakNoZWNrZWQ9PXRydWUpIHsNCgkJCQkJCQkJCQkJCQliTGlzdC5hZGQoZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoYUxpc3QuZ2V0KGkpKSk7DQoJCQkJCQkJCQkJCQkJaGFzRWxlbWVudHMgPSB0cnVlOw0KCQkJCQkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQkJZWxzZSBpZiAoKGFMaXN0LmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB8fCAoYUxpc3QuZ2V0KGkpIGluc3RhbmNlb2YgUGFydGljaXBhbnQpKSB7DQoJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJCWZvciAoIEVPYmplY3Qga2V5IDogcHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCQkJCQkJCQkJaWYocHJvY2Vzc0FsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSE9bnVsbCl7DQoJCQkJCQkJCQkJCQlvYmpDaGVja2VkID0gZXhpc3RPYmplY3QoYUxpc3QuZ2V0KGkpLCBwcm9jZXNzQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpKTsNCgkJCQkJCQkJCQkJCWlmIChvYmpDaGVja2VkPT10cnVlKSB7DQoJCQkJCQkJCQkJCQkJYkxpc3QuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFMaXN0LmdldChpKSkpOw0KCQkJCQkJCQkJCQkJCWhhc0VsZW1lbnRzID0gdHJ1ZTsNCgkJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJCWVsc2UgaWYgKGFMaXN0LmdldChpKSBpbnN0YW5jZW9mIENsYWltKSB7DQoJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJCWZvciAoIEVPYmplY3Qga2V5IDogYXJnQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJCQkJCQkJCQlpZihhcmdBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkhPW51bGwpew0KCQkJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGV4aXN0T2JqZWN0KGFMaXN0LmdldChpKSwgYXJnQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpKTsNCgkJCQkJCQkJCQkJCWlmIChvYmpDaGVja2VkPT10cnVlKSB7DQoJCQkJCQkJCQkJCQkJYkxpc3QuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFMaXN0LmdldChpKSkpOw0KCQkJCQkJCQkJCQkJCWhhc0VsZW1lbnRzID0gdHJ1ZTsNCgkJCQkJCQkJCQkJCQlicmVhazsNCgkJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCQlpZiAoaGFzRWxlbWVudHMpIHsNCgkJCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGJMaXN0KTsNCgkJCQkJCQkJfQ0KCQkJCQkJCX0JDQoJCQkJCQkNCgkJCQkJCX0NCgkJCQkJCWVsc2UgaWYoYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiSW5mb3JtYXRpb25FbGVtZW50Q2l0YXRpb24iKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJhcnRlZmFjdCIpICl7DQoJCQkJCQkJaWYoYUVPYmplY3QuZUdldChhRmVhdHVyZSkgaW5zdGFuY2VvZiBFTGlzdCl7DQoJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCQkJCQkJCQlFTGlzdDxFT2JqZWN0PiBhTGlzdCA9IChFTGlzdDxFT2JqZWN0PikgYUVPYmplY3QuZUdldChhRmVhdHVyZSk7DQoJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGJMaXN0ID0gbmV3IEJhc2ljRUxpc3Q8RU9iamVjdD4oKTsgDQoJCQkJCQkJCWJvb2xlYW4gaGFzRWxlbWVudHMgPSBmYWxzZTsNCgkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhTGlzdC5zaXplKCk7IGkrKykgew0KCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJZm9yICggRU9iamVjdCBrZXkgOiBldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5rZXlTZXQoKSApIHsNCgkJCQkJCQkJCQlpZihldmlkZW5jZUFsbFNlbGVjdGVkT2JqZWN0cy5nZXQoa2V5KSE9bnVsbCl7DQoJCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhTGlzdC5nZXQoaSksIGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpKTsNCgkJCQkJCQkJCQkJaWYgKG9iakNoZWNrZWQ9PXRydWUpIHsNCgkJCQkJCQkJCQkJCWJMaXN0LmFkZChnZXRDb3JyZXNwb25kaW5nRU9iamVjdChhTGlzdC5nZXQoaSkpKTsNCgkJCQkJCQkJCQkJCWhhc0VsZW1lbnRzID0gdHJ1ZTsNCgkJCQkJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWlmIChoYXNFbGVtZW50cykgew0KCQkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgYkxpc3QpOw0KCQkJCQkJCQl9DQoJCQkJCQkJfQkNCgkJCQkJCX0NCgkJCQkJCQ0KCQkJCQkJZWxzZSBpZiggKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIlBhcnRpY2lwYW50IikgJiYgYUZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygib3duZWRBcnRlZmFjdCIpICkgfHwNCgkJCQkJCQkJIChhRU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJBY3Rpdml0eSIpICYmIGFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoInJlcXVpcmVkQXJ0ZWZhY3QiKSApIHx8DQoJCQkJCQkJCSAoYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiQWN0aXZpdHkiKSAmJiBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJwcm9kdWNlZEFydGVmYWN0IikgKSB8fA0KCQkJCQkJCQkgKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIlRlY2huaXF1ZSIpICYmIGFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImNyZWF0ZWRBcnRlZmFjdCIpICkgKXsNCgkJCQkJCQlpZihhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSBpbnN0YW5jZW9mIEVMaXN0KXsNCgkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJCQkJCQkJCUVMaXN0PEVPYmplY3Q+IGFMaXN0ID0gKEVMaXN0PEVPYmplY3Q+KSBhRU9iamVjdC5lR2V0KGFGZWF0dXJlKTsNCgkJCQkJCQkJRUxpc3Q8RU9iamVjdD4gYkxpc3QgPSBuZXcgQmFzaWNFTGlzdDxFT2JqZWN0PigpOyANCgkJCQkJCQkJYm9vbGVhbiBoYXNFbGVtZW50cyA9IGZhbHNlOw0KCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7DQoJCQkJCQkJCQlvYmpDaGVja2VkID0gZmFsc2U7DQoJCQkJCQkJCQlmb3IgKCBFT2JqZWN0IGtleSA6IGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmtleVNldCgpICkgew0KCQkJCQkJCQkJCWlmKGV2aWRlbmNlQWxsU2VsZWN0ZWRPYmplY3RzLmdldChrZXkpIT1udWxsKXsNCgkJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGV4aXN0T2JqZWN0KGFMaXN0LmdldChpKSwgZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMuZ2V0KGtleSkpOw0KCQkJCQkJCQkJCQlpZiAob2JqQ2hlY2tlZD09dHJ1ZSkgew0KCQkJCQkJCQkJCQkJYkxpc3QuYWRkKGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KGFMaXN0LmdldChpKSkpOw0KCQkJCQkJCQkJCQkJaGFzRWxlbWVudHMgPSB0cnVlOw0KCQkJCQkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJaWYgKGhhc0VsZW1lbnRzKSB7DQoJCQkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBiTGlzdCk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9CQ0KCQkJCQkJfQ0KCQkJCQkJLyplbHNlIGlmKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIk1hcEdyb3VwIikpew0KCQkJCQkJCUVPYmplY3QgY29weT0gZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsIGNvcHkpOwkJCQkJCQkNCgkJCQkJCX0NCgkJCQkJCQ0KCQkJCQkJZWxzZSBpZihhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJyZWZGcmFtZXdvcmsiKSB8fCBhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJyZWZBc3N1cmFibGVFbGVtZW50Iikpew0KCQkJCQkJCWJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJfQ0KCQkJCQkJLyplbHNlIGlmIChhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtYXBKdXN0aWZpY2F0aW9uIikpew0KCQkJCQkJCUVPYmplY3QgY29weT0gZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSkpOw0KCQkJCQkJCS8vY29weUFFT2JqZWN0VG9CRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSxjb3B5LCBudWxsKTsNCgkJCQkJCQkNCgkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBjb3B5KTsNCgkJCQkJCX0qLw0KCQkJCQkJLyplbHNlIGlmIChhRmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJvd25lZFRlY2huaXF1ZSIpKXsNCgkJCQkJCQlFT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQkvL2NvcHlBRU9iamVjdFRvQkVPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSksY29weSwgbnVsbCk7DQoJCQkJCQkJDQoJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgY29weSk7DQoJCQkJCQl9Ki8JCQkJCQkNCgkJCQkJCWVsc2UgaWYgKGFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1hcEdyb3VwIikpew0KCQkJCQkJCWlmKGFFT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkJhc2VDb21wbGlhbmNlTWFwIikpew0KCQkJCQkJCQlFT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgY29weSk7DQoJCQkJCQkJfQ0KCQkJCQkJCWVsc2V7DQoJCQkJCQkJLy9FT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQkvL2NvcHlBRU9iamVjdFRvQkVPYmplY3QoKEVPYmplY3QpYUVPYmplY3QuZUdldChhRmVhdHVyZSksY29weSwgbnVsbCk7DQoJCQkJCQkJDQoJCQkJCQkJLy9iRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBjb3B5KTsNCgkJCQkJCQkNCgkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSxhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZWxzZXsJDQoJCQkJCQkJaWYoIWFGZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImxpZmVjeWNsZUV2ZW50Iikpew0KCQkJCQkJCQlpZihhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSBpbnN0YW5jZW9mIEVMaXN0KXsNCgkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCQkJCQkJCQkJRUxpc3Q8RU9iamVjdD4gYUxpc3QgPSAoRUxpc3Q8RU9iamVjdD4pIGFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpOw0KCQkJCQkJCQkJRUxpc3Q8RU9iamVjdD4gYkxpc3QgPSBuZXcgQmFzaWNFTGlzdDxFT2JqZWN0PigpOyANCgkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYUxpc3Quc2l6ZSgpOyBpKyspIHsNCgkJCQkJCQkJCQlpZihzZWxlY3RlZE9iamVjdHMhPW51bGwpew0KCQkJCQkJCQkJCQlvYmpDaGVja2VkID0gZmFsc2U7DQoJCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdChhTGlzdC5nZXQoaSksIHNlbGVjdGVkT2JqZWN0cyk7DQoJCQkJCQkJCQkJCWlmIChvYmpDaGVja2VkPT1mYWxzZSkgew0KCQkJCQkJCQkJCQkJICBjb250aW51ZTsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQliTGlzdC5hZGQoZ2V0Q29ycmVzcG9uZGluZ0VPYmplY3QoYUxpc3QuZ2V0KGkpKSk7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQliRU9iamVjdC5lU2V0KGJGZWF0dXJlLCBiTGlzdCk7DQoJCQkJCQkJCX0NCgkJCQkJCQkJZWxzZXsNCgkJCQkJCQkJCWlmKHNlbGVjdGVkT2JqZWN0cyE9bnVsbCl7DQoJCQkJCQkJCQkJb2JqQ2hlY2tlZCA9IGZhbHNlOw0KCQkJCQkJCQkJCW9iakNoZWNrZWQgPSBleGlzdE9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSwgc2VsZWN0ZWRPYmplY3RzKTsNCgkJCQkJCQkJCQlpZiAob2JqQ2hlY2tlZD09ZmFsc2UpIHsNCgkJCQkJCQkJCQkJICBjb250aW51ZTsNCgkJCQkJCQkJCQl9DQoJCQkJCQkJCQl9DQoJCQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRmVhdHVyZSAiICsgYUZlYXR1cmUuZ2V0TmFtZSgpICsgIiBvZiAiICsgYUVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiBub3QgY29waWVkIHRvIEJhc2VsaW5lIik7DQoJCQkJCQkJCQlFT2JqZWN0IGNvcHk9IGdldENvcnJlc3BvbmRpbmdFT2JqZWN0KChFT2JqZWN0KWFFT2JqZWN0LmVHZXQoYUZlYXR1cmUpKTsNCgkJCQkJCQkJCS8vY29weUFFT2JqZWN0VG9CRU9iamVjdCgoRU9iamVjdClhRU9iamVjdC5lR2V0KGFGZWF0dXJlKSxjb3B5LCBudWxsKTsNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJYkVPYmplY3QuZVNldChiRmVhdHVyZSwgY29weSk7DQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgkJDQoJCS8vQWRkIHRoZSBsaW5rZiB0byB0aGUgcmVmZnJhbWVvcmsgbW9kZWwgY29uY2VwdHMuDQoJCQ0KCQkvKmlmKGFFT2JqZWN0IGluc3RhbmNlb2YgUmVmRnJhbWV3b3JrKXsNCgkJCSBFU3RydWN0dXJhbEZlYXR1cmUgYkZlYXR1cmUgPSBiRU9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInJlZkZyYW1ld29yayIpOw0KCQkJIGJFT2JqZWN0LmVTZXQoYkZlYXR1cmUsYUVPYmplY3QpOw0KCQl9DQoJCWVsc2UgaWYoYkVPYmplY3QgaW5zdGFuY2VvZiBCYXNlQXNzdXJhYmxlRWxlbWVudCl7DQoJCQlFU3RydWN0dXJhbEZlYXR1cmUgYkZlYXR1cmUgPSBiRU9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInJlZkFzc3VyYWJsZUVsZW1lbnQiKTsNCgkJCSBiRU9iamVjdC5lU2V0KGJGZWF0dXJlLGFFT2JqZWN0KTsNCgkJfSovDQoJCQ0KCX0NCg0KCUFycmF5TGlzdDxDRE9SZXNvdXJjZU5vZGU+IGZpbmRBc3N1cmFuY2VQcm9qZWN0cygpew0KCQlBcnJheUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPiBwcm9qZWN0TGlzdD1uZXcgQXJyYXlMaXN0PENET1Jlc291cmNlTm9kZT4oKTsNCgkJQ0RPUmVzb3VyY2VOb2RlW10gbGlzdFI9ICB0cmFuc2FjdGlvbkNETy5nZXRFbGVtZW50cygpOwkJCQ0KCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RSLmxlbmd0aDsgaSsrKSB7DQoJCQlpZiAobGlzdFJbaV0gaW5zdGFuY2VvZiBDRE9SZXNvdXJjZUZvbGRlcikgew0KCQkJCWNoZWNrRm9sZGVyQ29udGVudHMoKENET1Jlc291cmNlRm9sZGVyKSBsaXN0UltpXSxBU1NVUkFOQ0VQUk9KRUNULCBwcm9qZWN0TGlzdCk7DQoJCQl9IGVsc2UgaWYgKGxpc3RSW2ldLmdldE5hbWUoKS5lbmRzV2l0aChBU1NVUkFOQ0VQUk9KRUNUKSkgew0KCQkJCXByb2plY3RMaXN0LmFkZChsaXN0UltpXSk7DQovLwkJCQlyZWZMaXN0RGlyTWFwLmFkZChsaXN0UltpXS5nZXRQYXRoKCkpOw0KCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKGxpc3RSW2ldLmdldFBhdGgoKSk7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIHByb2plY3RMaXN0Ow0KCX0NCgkNCg0KCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNSZWFkUGVybWlzc2lvbihDRE9SZXNvdXJjZU5vZGUgbm9kZSkgew0KCQkvLyBmb3JjZSB0byBnZXQgdGhlIGxhc3QgcmV2aXNpb24NCgkJbm9kZS5jZG9SZWxvYWQoKTsNCgkJQ0RPUGVybWlzc2lvbiBwZXJtaXNzaW9uID0gbm9kZS5jZG9SZXZpc2lvbigpLmdldFBlcm1pc3Npb24oKTsNCgkJcmV0dXJuIHBlcm1pc3Npb24uaXNSZWFkYWJsZSgpOw0KCX0NCgkNCglwcml2YXRlIEFycmF5TGlzdDxDRE9SZXNvdXJjZU5vZGU+IGNoZWNrRm9sZGVyQ29udGVudHMoQ0RPUmVzb3VyY2VGb2xkZXIgY2RvUmVzb3VyY2VGb2xkZXIsIFN0cmluZyBzQ2FkZW5hLCBBcnJheUxpc3Q8Q0RPUmVzb3VyY2VOb2RlPnByb2plY3RMaXN0KSB7DQoJCWlmIChoYXNSZWFkUGVybWlzc2lvbihjZG9SZXNvdXJjZUZvbGRlcikpIHsNCgkJCUVMaXN0PENET1Jlc291cmNlTm9kZT4gbGlzdE4gPSBjZG9SZXNvdXJjZUZvbGRlci5nZXROb2RlcygpOw0KCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Ti5zaXplKCk7IGkrKykgew0KCQkJCWlmIChsaXN0Ti5nZXQoaSkgaW5zdGFuY2VvZiBDRE9SZXNvdXJjZUZvbGRlcikgew0KCQkJCQljaGVja0ZvbGRlckNvbnRlbnRzKChDRE9SZXNvdXJjZUZvbGRlcikgbGlzdE4uZ2V0KGkpLCBzQ2FkZW5hLCBwcm9qZWN0TGlzdCk7DQoJCQkJfSBlbHNlIGlmIChsaXN0Ti5nZXQoaSkuZ2V0TmFtZSgpLmVuZHNXaXRoKHNDYWRlbmEpKSB7DQoJCQkJCXByb2plY3RMaXN0LmFkZChsaXN0Ti5nZXQoaSkpOw0KCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaXN0Ti5nZXQoaSkuZ2V0UGF0aCgpKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuIHByb2plY3RMaXN0Ow0KCX0NCgkNCglwcm90ZWN0ZWQgdm9pZCBzb3VyY2VQcm9qZWN0Q2hhbmdlZCgpIHsNCgkJaW50IHNvdXJjZWluZGV4PXNvdXJjZVByb2plY3RDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOw0KCQlDRE9SZXNvdXJjZU5vZGUgc2VsZWN0ZWRTb3VyY2U9cHJvamVjdHMuZ2V0KHNvdXJjZWluZGV4KTsNCgkJUmVzb3VyY2VTZXQgIGJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7DQoJCWJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQuZVNldERlbGl2ZXIodHJ1ZSk7DQoJCXRyeSB7DQoJCQkNCgkJCUNET1Jlc291cmNlIGFydGVmYWN0UmVzb3VyY2UgPSBudWxsOw0KCQkJQ0RPUmVzb3VyY2UgcHJvY2Vzc1Jlc291cmNlID0gbnVsbDsNCgkJCUNET1Jlc291cmNlIGFyZ1Jlc291cmNlID0gbnVsbDsNCgkJCQ0KCQkJcmVzb3VyY2VBUFNvdXJjZSA9IHRyYW5zYWN0aW9uQ0RPLmdldFJlc291cmNlKHNlbGVjdGVkU291cmNlLmdldFBhdGgoKSk7DQoJCQlhc3N1cmFuY2VQcm9qZWN0U291cmNlID0gKEFzc3VyYW5jZVByb2plY3QpIHJlc291cmNlQVBTb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7DQoJCQlpZih0YXJnZXRQcm9qZWN0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKT4tMSl7DQoJCQkJcmV1c2VCdG4uc2V0RW5hYmxlZCh0cnVlKTsNCgkJCX0JCQkJCQkNCgkJCS8vTG9hZCBTb3VyY2UgQmFzZWxpbmVzDQoJCQlFTGlzdDxCYXNlbGluZUNvbmZpZz4gbHN0QmFzZWxpbmVDb25maWcgPSBhc3N1cmFuY2VQcm9qZWN0U291cmNlLmdldEJhc2VsaW5lQ29uZmlnKCk7DQoJCQlJdGVyYXRvcjxCYXNlbGluZUNvbmZpZz4gYmFzZWxpbmVDb25maWcgPSBsc3RCYXNlbGluZUNvbmZpZy5pdGVyYXRvcigpOw0KCQkJDQoJCQlCYXNlbGluZUNvbmZpZyBiY29uZmlnPW51bGw7DQoJCQkNCgkJCWJvb2xlYW4gYkZpbmQgPSBmYWxzZTsNCgkJCXdoaWxlIChiYXNlbGluZUNvbmZpZy5oYXNOZXh0KCkgJiYgIWJGaW5kKSB7DQoJCQkJYmNvbmZpZyA9IGJhc2VsaW5lQ29uZmlnLm5leHQoKTsNCgkJCQlpZiAoYmNvbmZpZy5pc0lzQWN0aXZlKCkpIHsNCgkJCQkJYkZpbmQgPSB0cnVlOw0KCQkJCQkNCgkJCQkJRUxpc3Q8QmFzZUZyYW1ld29yaz4gbHN0QmFzZUZyYW1ld29yayA9IGJjb25maWcuZ2V0UmVmRnJhbWV3b3JrKCk7CQkJCQkJCQkJCQ0KCQkJCQlJdGVyYXRvcjxCYXNlRnJhbWV3b3JrPiBpdGJhc2VGcmFtZXdvcmsgPSBsc3RCYXNlRnJhbWV3b3JrLml0ZXJhdG9yKCk7DQoJCQkJCQ0KCQkJCQl3aGlsZSAoaXRiYXNlRnJhbWV3b3JrLmhhc05leHQoKSkgew0KCQkJCQkJCQkJCQkJCQkJDQoJCQkJCQlCYXNlRnJhbWV3b3JrIGJhc2VGcmFtZXdvcmsgPSBpdGJhc2VGcmFtZXdvcmsubmV4dCgpOw0KCQkJCQkJYmFzZWxpbmVSZXNvdXJjZSA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGJhc2VGcmFtZXdvcmspLmNkb1Jlc291cmNlKCk7DQoJCQkJCQl0cnkgew0KCQkJCQkJCWJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGJhc2VsaW5lUmVzb3VyY2UpOw0KCQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgew0KCQkJCQkJCS8vSWdub3JlIGl0IA0KCQkJCQkJfQ0KCQkJCQkJYmFzZWxpbmVBbGxTZWxlY3RlZE9iamVjdHMucHV0KGJhc2VsaW5lUmVzb3VyY2UsIG51bGwpOw0KCQkJCQl9DQoJCQkJCS8vdHJlZUJhc2VsaW5lU291cmNlLnNldElucHV0KGJhc2VsaW5lU291cmNlUmVzb3VyY2VTZXQpOw0KCQkJCQkJDQoJCQkJCUNyZWF0ZU1vZGVsRnJvbVJlc291cmNlU2V0KGNoZWNrdHJlZUJhc2VsaW5lU291cmNlLCBiYXNlbGluZVNvdXJjZVJlc291cmNlU2V0KTsNCgkJCQkJYmFzZWxpbmVTb3VyY2VSZXNvdXJjZVNldD0gbnVsbDsNCgkJCQkJLy9UbyBzZWFyY2ggdGhlIG5vZGVzIHRvIGJlIG1vdmVkLg0KCQkJCQljaGVja3RyZWVCYXNlbGluZVNvdXJjZS5leHBhbmRBbGwoKTsNCgkJCQkJCQkJCQkJCQkJCQkJCQkNCgkJCQkJLy9UbyBleHBhbmQgdGhlIG1vdmVkIG5vZGVzLg0KCQkJCQkvL3RyZWVCYXNlbGluZVNvdXJjZS5leHBhbmRBbGwoKTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCS8vTG9hZCB0aGUgZXZpZGVuY2UgbW9kZWxzIG9mIHRoZSBhY3RpdmUgYXNzZXRzUGFja2FnZSBvZiB0aGUgc2VsZWN0ZWQgYXNzdXJhbmNlIHByb2plY3QgDQoJCQlFTGlzdDxBc3NldHNQYWNrYWdlPiBsc3RBc3NldHNQYWNrYWdlID0gYXNzdXJhbmNlUHJvamVjdFNvdXJjZS5nZXRBc3NldHNQYWNrYWdlKCk7DQoJCQlJdGVyYXRvcjxBc3NldHNQYWNrYWdlPiBhc3NldHNQYWNrYWdlID0gbHN0QXNzZXRzUGFja2FnZS5pdGVyYXRvcigpOw0KCQkJDQoJCQlSZXNvdXJjZVNldCBldmlkZW5jZVNvdXJjZVJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KCQkJQXNzZXRzUGFja2FnZSBhUGFja2FnZT1udWxsOw0KCQkJDQoJCQkvL0xvYWQgdGhlIGFyZ3VtZW50YXRpb24gbW9kZWxzIG9mIHRoZSBhY3RpdmUgYXNzZXRzUGFja2FnZSBvZiB0aGUgc2VsZWN0ZWQgYXNzdXJhbmNlIHByb2plY3QgCQkJCQkJCQkJCQkJDQoJCQlSZXNvdXJjZVNldCBhcmdTb3VyY2VSZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsNCgkJCQ0KCQkJLy9Mb2FkIHRoZSBwcm9jZXNzIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IAkJCQkJCQkJCQkJCQ0KCQkJUmVzb3VyY2VTZXQgcHJvY2Vzc1NvdXJjZVJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOw0KCQkJDQoJCQliRmluZCA9IGZhbHNlOw0KCQkJd2hpbGUgKGFzc2V0c1BhY2thZ2UuaGFzTmV4dCgpICYmICFiRmluZCkgew0KCQkJCWFQYWNrYWdlID0gYXNzZXRzUGFja2FnZS5uZXh0KCk7DQoJCQkJaWYgKGFQYWNrYWdlLmlzSXNBY3RpdmUoKSkgew0KCQkJCQliRmluZD0gdHJ1ZTsNCgkJCQkJRUxpc3Q8QXJ0ZWZhY3RNb2RlbD4gbHN0QXJ0ZWZhY3RNb2RlbCA9IGFQYWNrYWdlLmdldEFydGVmYWN0c01vZGVsKCk7DQoJCQkJCUl0ZXJhdG9yPEFydGVmYWN0TW9kZWw+IGFydGVmYWN0TW9kZWwgPSBsc3RBcnRlZmFjdE1vZGVsLml0ZXJhdG9yKCk7DQoJCQkJCXdoaWxlIChhcnRlZmFjdE1vZGVsLmhhc05leHQoKSkgew0KCQkJCQkJQXJ0ZWZhY3RNb2RlbCBhcnRlZmFjdCA9IGFydGVmYWN0TW9kZWwubmV4dCgpOw0KCQkJCQkJYXJ0ZWZhY3RSZXNvdXJjZSA9IENET1V0aWwuZ2V0Q0RPT2JqZWN0KGFydGVmYWN0KS5jZG9SZXNvdXJjZSgpOw0KCQkJCQkJdHJ5IHsNCgkJCQkJCQlldmlkZW5jZVNvdXJjZVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChhcnRlZmFjdFJlc291cmNlKTsNCgkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsNCgkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQoJCQkJCQkJLy9lLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJCQkJfQ0KCQkJCQkJZXZpZGVuY2VBbGxTZWxlY3RlZE9iamVjdHMucHV0KGFydGVmYWN0UmVzb3VyY2UsIG51bGwpOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlFTGlzdDxDYXNlPiBsc3RBcmdNb2RlbCA9IGFQYWNrYWdlLmdldEFyZ3VtZW50YXRpb25Nb2RlbCgpOw0KCQkJCQlJdGVyYXRvcjxDYXNlPiBhcmdNb2RlbCA9IGxzdEFyZ01vZGVsLml0ZXJhdG9yKCk7DQoJCQkJCXdoaWxlIChhcmdNb2RlbC5oYXNOZXh0KCkpIHsNCgkJCQkJCUNhc2UgYXJnUm9vdCA9IGFyZ01vZGVsLm5leHQoKTsNCgkJCQkJCWFyZ1Jlc291cmNlID0gQ0RPVXRpbC5nZXRDRE9PYmplY3QoYXJnUm9vdCkuY2RvUmVzb3VyY2UoKTsNCgkJCQkJCXRyeSB7DQoJCQkJCQkJYXJnU291cmNlUmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKGFyZ1Jlc291cmNlKTsNCgkJCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsNCgkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrDQoJCQkJCQkJLy9EbyBub3RoaW5nDQoJCQkJCQl9DQoJCQkJCQlhcmdBbGxTZWxlY3RlZE9iamVjdHMucHV0KGFyZ1Jlc291cmNlLCBudWxsKTsNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJRUxpc3Q8UHJvY2Vzc01vZGVsPiBsc3RQcm9jZXNzTW9kZWwgPSBhUGFja2FnZS5nZXRQcm9jZXNzTW9kZWwoKTsNCgkJCQkJSXRlcmF0b3I8UHJvY2Vzc01vZGVsPiBwcm9jZXNzTW9kZWwgPSBsc3RQcm9jZXNzTW9kZWwuaXRlcmF0b3IoKTsNCgkJCQkJd2hpbGUgKHByb2Nlc3NNb2RlbC5oYXNOZXh0KCkpIHsNCgkJCQkJCVByb2Nlc3NNb2RlbCBwcm9jZXNzUm9vdCA9IHByb2Nlc3NNb2RlbC5uZXh0KCk7DQoJCQkJCQlwcm9jZXNzUmVzb3VyY2UgPSBDRE9VdGlsLmdldENET09iamVjdChwcm9jZXNzUm9vdCkuY2RvUmVzb3VyY2UoKTsNCgkJCQkJCXRyeSB7DQoJCQkJCQkJcHJvY2Vzc1NvdXJjZVJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChwcm9jZXNzUmVzb3VyY2UpOw0KCQkJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgew0KCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCgkJCQkJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7DQoJCQkJCQl9DQoJCQkJCQlwcm9jZXNzQWxsU2VsZWN0ZWRPYmplY3RzLnB1dChwcm9jZXNzUmVzb3VyY2UsIG51bGwpOw0KCQkJCQl9CQ0KCQkJCX0NCgkJCQlDcmVhdGVNb2RlbEZyb21SZXNvdXJjZVNldChjaGVja3RyZWVFdmlkZW5jZVNvdXJjZSwgZXZpZGVuY2VTb3VyY2VSZXNvdXJjZVNldCk7DQoJCQkJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2UuZXhwYW5kQWxsKCk7DQoJCQkJDQoJCQkJQ3JlYXRlTW9kZWxGcm9tUmVzb3VyY2VTZXQoY2hlY2t0cmVlQXJnU291cmNlLCBhcmdTb3VyY2VSZXNvdXJjZVNldCk7DQoJCQkJY2hlY2t0cmVlQXJnU291cmNlLmV4cGFuZEFsbCgpOwkNCgkJCQkNCgkJCQlDcmVhdGVNb2RlbEZyb21SZXNvdXJjZVNldChjaGVja3RyZWVQcm9jZXNzU291cmNlLCBwcm9jZXNzU291cmNlUmVzb3VyY2VTZXQpOw0KCQkJCWNoZWNrdHJlZVByb2Nlc3NTb3VyY2UuZXhwYW5kQWxsKCk7CQ0KCQkJfQkNCgkJCQ0KCQkJDQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjZG9lKSB7DQoJCQljZG9lLnByaW50U3RhY2tUcmFjZSgpOw0KCQkJdHJhbnNhY3Rpb25DRE8ucm9sbGJhY2soKTsNCgkJfQ0KCX0NCgkNCglwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUmV1c2UoKSB7DQoJCWJvb2xlYW4gYWxsT0s9dHJ1ZTsNCgkJaWYodGFyZ2V0UHJvamVjdENvbWJvLmdldFRleHQoKS5sZW5ndGgoKT09MCl7DQoJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihuZXcgU2hlbGwoKSwgIlNlbGVjdGVkIFNvdXJjZSBQcm9qZWN0IiwNCgkJCQkJIllvdSBtdXN0IHNlbGVjdCB0aGUgc291cmNlIHByb2plY3Qgb2YgdGhlIHJldXNlLiIpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCQ0KCQlpZiAoIChjaGVja3RyZWVFdmlkZW5jZVNvdXJjZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGghPTApIHx8DQoJCQkJIChjaGVja3RyZWVBcmdTb3VyY2UuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoIT0wKSB8fA0KCQkJCSAoY2hlY2t0cmVlUHJvY2Vzc1NvdXJjZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGghPTApIHx8DQoJCQkJIChjaGVja3RyZWVCYXNlbGluZVNvdXJjZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGghPTApKSB7DQoJCQkvL0xvYWQgdGhlIGV2aWRlbmNlIG1vZGVscyBvZiB0aGUgYWN0aXZlIGFzc2V0c1BhY2thZ2Ugb2YgdGhlIHNlbGVjdGVkIGFzc3VyYW5jZSBwcm9qZWN0IA0KCQkJRUxpc3Q8QXNzZXRzUGFja2FnZT4gbHN0QXNzZXRzUGFja2FnZSA9IGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QXNzZXRzUGFja2FnZSgpOw0KCQkJSXRlcmF0b3I8QXNzZXRzUGFja2FnZT4gYXNzZXRzUGFja2FnZSA9IGxzdEFzc2V0c1BhY2thZ2UuaXRlcmF0b3IoKTsNCg0KCQkJbWFwID0gbmV3IEhhc2hNYXA8RU9iamVjdCwgRU9iamVjdD4oKTsNCgkJCW9wdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsNCgkJCQ0KCQkJd2hpbGUgKGFzc2V0c1BhY2thZ2UuaGFzTmV4dCgpKSB7DQoJCQkJdGFyZ2V0QXNzZXRzUGFja2FnZSA9IGFzc2V0c1BhY2thZ2UubmV4dCgpOw0KCQkJCWlmICh0YXJnZXRBc3NldHNQYWNrYWdlLmlzSXNBY3RpdmUoKSkgew0KCQkJCQlicmVhazsJCQkJDQoJCQkJfQ0KCQkJfQ0KCQl9DQoJCWVsc2Ugew0KCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IobmV3IFNoZWxsKCksICJTZWxlY3RlZCBNb2RlbHMiLA0KCQkJCQkiWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0IG9uZSBtb2RlbCB0byBiZSByZXVzZWQuIik7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQkNCgkJdHJ5IHsNCgkJCWlmIChjaGVja3RyZWVCYXNlbGluZVNvdXJjZS5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGghPTApIHsNCgkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKG5ldyBTaGVsbCgpLCAiQ2hhbmdlcyB0byB0YXJnZXQgQXNzdXJhbmNlIFByb2plY3QiLA0KCQkJCQkJIlRoZSBtb2RlbCB3aWxsIGJlIGNvcGllZCBhbmQgcmVsYXRlZCB0byBhIG5ldyBBc3NldCBQYWNrYWdlIGFuZCBCYXNlbGluZSBDb25maWd1cmF0aW9uIHRoYXQgd2lsbCBiZSBzZXQgdXAgYXMgdGhlIGFjdGl2ZSBvbmVzLiIpOw0KCQkJCXByb2plY3RQYWNrYWdlID0gQXNzdXJhbmNlcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOw0KCQkJCXByb2plY3RGYWN0b3J5ID0gcHJvamVjdFBhY2thZ2UuZ2V0QXNzdXJhbmNlcHJvamVjdEZhY3RvcnkoKTsNCgkJCQkNCgkJCQlBc3NldHNQYWNrYWdlIG5ld0FQPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVBc3NldHNQYWNrYWdlKCk7CQkJCQkJCQkNCgkJCQluZXdBUC5zZXRJZCgiIiArIGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QXNzZXRzUGFja2FnZSgpLnNpemUoKSk7DQoJCQkJbmV3QVAuc2V0TmFtZSgiQVBfIiArIGFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QXNzZXRzUGFja2FnZSgpLnNpemUoKSk7DQoJCQkJbmV3QVAuc2V0RGVzY3JpcHRpb24oIkNyZWF0ZWQgYXV0b21hdGljYWxseSBmb3IgQ3Jvc3MgUHJvamVjdCBSZXVzZSIpOwkJCQ0KCQkJCW5ld0FQLnNldElzQWN0aXZlKHRydWUpOw0KCQkJCWFzc3VyYW5jZVByb2plY3RUYXJnZXQuZ2V0QXNzZXRzUGFja2FnZSgpLmFkZChuZXdBUCk7DQoJCQkJdGFyZ2V0QXNzZXRzUGFja2FnZS5zZXRJc0FjdGl2ZShmYWxzZSk7DQoJCQkJdGFyZ2V0QXNzZXRzUGFja2FnZT1uZXdBUDsNCgkJCQkNCgkJCQlCYXNlbGluZUNvbmZpZyBuZXdCQyA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZUJhc2VsaW5lQ29uZmlnKCk7DQoJCQkJbmV3QkMuc2V0SWQoIiIgKyBhc3N1cmFuY2VQcm9qZWN0VGFyZ2V0LmdldEJhc2VsaW5lQ29uZmlnKCkuc2l6ZSgpKTsNCgkJCQluZXdCQy5zZXROYW1lKCJBUF8iICsgYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXRCYXNlbGluZUNvbmZpZygpLnNpemUoKSk7DQoJCQkJbmV3QkMuc2V0RGVzY3JpcHRpb24oIkNyZWF0ZWQgYXV0b21hdGljYWxseSBmb3IgQ3Jvc3MgUHJvamVjdCBSZXVzZSIpOwkJCQ0KCQkJCQ0KCQkJCS8vTG9hZCB0aGUgZXZpZGVuY2UgbW9kZWxzIG9mIHRoZSBhY3RpdmUgYXNzZXRzUGFja2FnZSBvZiB0aGUgc2VsZWN0ZWQgYXNzdXJhbmNlIHByb2plY3QgDQoJCQkJRUxpc3Q8QmFzZWxpbmVDb25maWc+IGxzdEJDID0gYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXRCYXNlbGluZUNvbmZpZygpOw0KCQkJCUl0ZXJhdG9yPEJhc2VsaW5lQ29uZmlnPiBiY0kgPSBsc3RCQy5pdGVyYXRvcigpOw0KCQkJCQkJCQkJCQ0KCQkJCS8vSW5hY3RpdmUgdGhlIGFjdGl2ZSBCYXNlbGluZSBDb25maWcNCgkJCQl3aGlsZSAoYmNJLmhhc05leHQoKSkgew0KCQkJCQlCYXNlbGluZUNvbmZpZyBvbmVCQyA9IGJjSS5uZXh0KCk7DQoJCQkJCWlmIChvbmVCQy5pc0lzQWN0aXZlKCkpIHsNCgkJCQkJCW9uZUJDLnNldElzQWN0aXZlKGZhbHNlKTsJCQkJDQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJbmV3QkMuc2V0SXNBY3RpdmUodHJ1ZSk7DQoJCQkJYXNzdXJhbmNlUHJvamVjdFRhcmdldC5nZXRCYXNlbGluZUNvbmZpZygpLmFkZChuZXdCQyk7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5RXZpZGVuY2VzKCk7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5QXJndW1lbnRhdGlvbnMoKTsNCgkJCQlpZiAoYWxsT0spIGFsbE9LPWNvcHlQcm9jZXNzZXMoKTsJDQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5TWFwcygpOw0KCQkJCS8vQmFzZWxpbmVzIGlzIHRoZSBsYXN0IGJlY2F1c2UgaGFzIG1hcHBpbmdzIHRvIHRoZSBvdGhlciBtb2RlbHMNCgkJCQlpZiAoYWxsT0spIGFsbE9LPWNvcHlCYXNlbGluZXMobmV3QkMpOw0KCQkJfQ0KCQkJZWxzZSB7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5RXZpZGVuY2VzKCk7DQoJCQkJaWYgKGFsbE9LKSBhbGxPSz1jb3B5QXJndW1lbnRhdGlvbnMoKTsNCgkJCQlpZiAoYWxsT0spIGFsbE9LPWNvcHlQcm9jZXNzZXMoKTsJCQkJDQoJCQl9DQoNCgkJCWlmKGFsbE9LKXsNCgkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihuZXcgU2hlbGwoKSwgIlJldXNlIHN1Y2Nlc3MiLCAiU2VsZWN0ZWQgbW9kZWxzIHJldXNlZCIpOw0KCQkJfQ0KDQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjZG9lKSB7DQoJCQljZG9lLnByaW50U3RhY2tUcmFjZSgpOw0KCQl9DQoJCQ0KCX0NCgkNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewkJDQoJCWlmICghdHJhbnNhY3Rpb25DRE8uaXNDbG9zZWQoKSkgew0KCQkJdHJhbnNhY3Rpb25DRE8uY2xvc2UoKTsNCgkJfQ0KCX0NCgkNCiAgICANCiAgICAvKioNCiAgICAgKiBDcmVhdGUgdG9vbGJhci4NCiAgICAgKi8NCiAgICBwcml2YXRlIHZvaWQgY3JlYXRlVG9vbGJhcigpIHsNCiAgICAgICAgICAgIElUb29sQmFyTWFuYWdlciBtZ3IgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOw0KICAgICAgICAgICAgbWdyLmFkZChhZGRJdGVtQWN0aW9uKTsNCiAgICB9DQogICAgDQogICAgcHVibGljIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsNCiAgICAgICAgYWRkSXRlbUFjdGlvbiA9IG5ldyBBY3Rpb24oIlJlZnJlc2giKSB7DQogICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeyANCiAgICAgICAgICAgICAgICAJc2V0UHJvamVjdERhdGFUb0NvbWJvKCk7DQogICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICB9Ow0KICAgICAgICBhZGRJdGVtQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihnZXRJbWFnZURlc2NyaXB0b3IoInJlZnJlc2guZ2lmIikpOw0KLy8gICAgICAgIA0KLy8gICAgICAgIC8vIEFkZCBzZWxlY3Rpb24gbGlzdGVuZXIuDQovLyAgICAgICAgdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCi8vICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGlvbkVuYTU1YmxlbWVudCgpOw0KLy8gICAgICAgICAgICAgICAgICAgfQ0KLy8gICAgICAgICAgIH0pOw0KICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVsYXRpdmUgcGF0aC4NCiAgICAgKi8NCiAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlbGF0aXZlUGF0aCkgew0KICAgICAgICAgICAJU3RyaW5nIGljb25QYXRoID0gImljb25zLyI7DQogICAgICAgICAgIAlSZXVzZVBsdWdpbiBwbHVnaW4gPSBSZXVzZVBsdWdpbi5nZXREZWZhdWx0KCk7DQogICAgICAgICAgIAlJbWFnZURlc2NyaXB0b3IgaW1nID0gcGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihpY29uUGF0aCArIHJlbGF0aXZlUGF0aCk7DQogICAgICAgICAgICByZXR1cm4gaW1nOw0KICAgIH0NCiAgICANCiAgICBwcml2YXRlIHZvaWQgc2V0UHJvamVjdERhdGFUb0NvbWJvKCkgew0KICAgIAlzb3VyY2VQcm9qZWN0Q29tYm8ucmVtb3ZlQWxsKCk7DQogICAgCXRhcmdldFByb2plY3RDb21iby5yZW1vdmVBbGwoKTsNCiAgICAJY2hlY2t0cmVlQmFzZWxpbmVTb3VyY2Uuc2V0SW5wdXQobnVsbCk7DQogICAgCWNoZWNrdHJlZVByb2Nlc3NTb3VyY2Uuc2V0SW5wdXQobnVsbCk7DQogICAgCWNoZWNrdHJlZUFyZ1NvdXJjZS5zZXRJbnB1dChudWxsKTsNCiAgICAJY2hlY2t0cmVlRXZpZGVuY2VTb3VyY2Uuc2V0SW5wdXQobnVsbCk7DQogICAgCXJldXNlQnRuLnNldEVuYWJsZWQoZmFsc2UpOw0KCQlwcm9qZWN0cz1maW5kQXNzdXJhbmNlUHJvamVjdHMoKTsNCgkJSXRlcmF0b3I8Q0RPUmVzb3VyY2VOb2RlPiBpdGVyYXRvciA9IHByb2plY3RzLml0ZXJhdG9yKCk7DQoJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7DQoJCQlDRE9SZXNvdXJjZU5vZGUgcHJvaj1pdGVyYXRvci5uZXh0KCk7DQoJCQlTdHJpbmcgbmFtZT1wcm9qLmdldE5hbWUoKTsNCgkJCXNvdXJjZVByb2plY3RDb21iby5hZGQobmFtZSk7DQoJCQlpZihwcm9qLmNkb1JldmlzaW9uKCkuZ2V0UGVybWlzc2lvbigpLmlzV3JpdGFibGUoKSl7DQoJCQkJdGFyZ2V0UHJvamVjdENvbWJvLmFkZChuYW1lKTsNCgkJCX0NCgkJfQ0KICAgIH0NCgkJDQp9DQoNCg==