LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai53aXphcmRzLnVpLndpemFyZHM7DQoNCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udWkudmlld3MuRGF3bkV4cGxvcmVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi51dGlsLmNvbm5lY3Rpb24uQ0RPQ29ubmVjdGlvblV0aWw7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5lcmVzb3VyY2UuQ0RPUmVzb3VyY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5lcmVzb3VyY2UuQ0RPUmVzb3VyY2VGb2xkZXI7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5zZXNzaW9uLkNET1Nlc3Npb247DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby50cmFuc2FjdGlvbi5DRE9UcmFuc2FjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLnZpZXcuQ0RPVmlldzsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UmVmZXJlbmNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7DQppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LmFwbS5hc3N1cnByb2oud2l6YXJkcy5XaXphcmRFTUZDb250ZXh0Ow0KDQoNCg0KDQpwdWJsaWMgY2xhc3MgTmV3QXNzdXJQcm9qV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElOZXdXaXphcmQgew0KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfRlJBTUVXT1JLX1NFTEVDVElPTiA9ICJSZWZlcmVuY2UgRnJhbWV3b3JrIFNlbGVjdGlvbiI7DQoNCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FTU1VSQU5DRV9QUk9KRUNUID0gIkNyZWF0ZSBBc3N1cmFuY2UgUHJvamVjdCI7DQoNCgkvKioNCgkgKiBMb2dnZXIuDQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5ld0Fzc3VyUHJvaldpemFyZC5jbGFzcyk7DQoJCQ0KCXByaXZhdGUgQXNzdXJQcm9qUmVmRnJhbWV3b3JrU2VsZWN0aW9uV2l6YXJkUGFnZSByZWZTZWxlY3Rpb25QYWdlOw0KCXByaXZhdGUgUHJvamVjdE5hbWUgcHJvamVjdDsJDQoJcHJvdGVjdGVkIFN0cmluZyBxcmVmRGlyOw0KDQoJcHVibGljIE5ld0Fzc3VyUHJvaldpemFyZCgpIHsNCgkJc3VwZXIoKTsNCgkgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7DQoNCgl9DQoJDQoJQE92ZXJyaWRlDQoJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsNCgkJQ0RPVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPW51bGw7DQoJCURhd25FeHBsb3JlciByZXBvVmlldyA9bnVsbDsNCgkJSVZpZXdSZWZlcmVuY2Ugdmlld1JlZmVyZW5jZXNbXSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldFZpZXdSZWZlcmVuY2VzKCk7DQoJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld1JlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCgkJCWlmICgib3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnVpLnZpZXdzLkRhd25FeHBsb3JlciIuZXF1YWxzKHZpZXdSZWZlcmVuY2VzW2ldLmdldElkKCkpKSB7DQoJCQkJcmVwb1ZpZXcgPSAoRGF3bkV4cGxvcmVyKXZpZXdSZWZlcmVuY2VzW2ldLmdldFZpZXcoZmFsc2UpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJCQ0KCQlpZihyZXBvVmlldyE9bnVsbCl7DQoJCQl0cmFuc2FjdGlvbj1yZXBvVmlldy5nZXRWaWV3KCkuZ2V0U2Vzc2lvbigpLm9wZW5UcmFuc2FjdGlvbigpOwkJCQkJDQoJCX0NCgkJZWxzZXsNCgkJCUNET0Nvbm5lY3Rpb25VdGlsLmluc3RhbmNlLmluaXQoDQoJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksDQoJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByb3RvY29sKCksDQoJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFNlcnZlck5hbWUoKSk7DQoJCQlDRE9TZXNzaW9uIHNlc3Npb25DRE8gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZS5nZXRDdXJyZW50U2Vzc2lvbigpOw0KCQkJQ0RPVmlldyB2aWV3ID0gc2Vzc2lvbkNETy5vcGVuVmlldygpOw0KCQkJdHJhbnNhY3Rpb249c2Vzc2lvbkNETy5vcGVuVHJhbnNhY3Rpb24oKTsJCQkNCgkJfQkNCgkJDQoJCUNET1Jlc291cmNlRm9sZGVyIGFzc3VyYW5jZVByb2plY3QgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlRm9sZGVyKHByb2plY3QuZ2V0UHJvamVjdEZvbGRlcigpICsgIi8iICsgIHByb2plY3QuZ2V0TmFtZSgpKTsNCgkJaWYoIWFzc3VyYW5jZVByb2plY3QuZ2V0Tm9kZXMoKS5pc0VtcHR5KCkpew0KCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIkVycm9yIiwgIkFscmVhZHkgZXhpc3RzIGFub3RoZXIgQXNzdXJhbmNlIFByb2plY3Qgd2l0aCB0aGUgc2FtZSBuYW1lLiBQbGVhc2UsIGNoYW5nZSBBc3N1cmFuY2UgUHJvamVjdCBOYW1lIik7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0JCQkJCQ0KCQkNCgkJYm9vbGVhbiBjb25maXJtYXRpb24gPSAgTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShnZXRTaGVsbCgpLCAiQXNzdXJhbmNlIFByb2plY3QgZ2VuZXJhdGlvbiIsICJUaGlzIHByb2Nlc3MgY291bGQgdGFrZSBhIHNldmVyYWwgbWludXRlcy5cblxuRG8geW91IHdhbnQgdG8gY29udGludWU/Iik7DQoJCWlmICghY29uZmlybWF0aW9uKSB7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJDQoJCXRyYW5zYWN0aW9uLmNsb3NlKCk7DQoJCQ0KCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaGVsbCgpKTsNCgkJZGlhbG9nLm9wZW4oKTsNCgkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZGlhbG9nLmdldFByb2dyZXNzTW9uaXRvcigpOw0KCQltb25pdG9yLmJlZ2luVGFzayhDUkVBVEVfQVNTVVJBTkNFX1BST0pFQ1QsIDIwKTsNCgkJDQoJDQoJCS8vYm9vbGVhbiBib29sID0gc3VwZXIucGVyZm9ybUZpbmlzaCgpOw0KCQltb25pdG9yLndvcmtlZCgxKTsNCg0KCQlBc3N1clByb2pJbml0aWFsaXphdGlvbkhlbHBlciBwcm9qZWN0SW5pdGlhbGl6ZXIgPSBjcmVhdGVQcm9qZWN0SW5pdGlhbGl6YXRpb25IZWxwZXIocHJvamVjdC5nZXROYW1lKCkscHJvamVjdC5nZXRQcm9qZWN0Rm9sZGVyKCksIHByb2plY3QuZ2VuZXJhdGVBcmd1bWVudGF0aW9uKCkpOwkJDQoJCW1vbml0b3Iud29ya2VkKDEpOw0KCQkNCgkJLy9SZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHdpemFyZEV4ZWN1dGlvbkNvbnRleHQuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7IA0KCQlPYmplY3RbXSByZWZSZXF1aXJlbWVudHMgPSByZWZTZWxlY3Rpb25QYWdlLmdldFNlbGVjdGVkUmVmUmVxKCk7DQoJCXFyZWZEaXIgPSByZWZTZWxlY3Rpb25QYWdlLmdldFFSZWYoKTsNCgkJdHJ5IHsJCQkNCgkJCXByb2plY3RJbml0aWFsaXplci5jcmVhdGVDcmVhdGVDb21tYW5kcyggbW9uaXRvciwgdGhpcy5nZXRDb250YWluZXIoKSxyZWZSZXF1aXJlbWVudHMsIHJlZlNlbGVjdGlvblBhZ2UuZ2V0U2VsZWN0ZWRDcml0TGV2ZWxzKCkscmVmU2VsZWN0aW9uUGFnZS5nZXRTZWxlY3RlZEFwbGlMZXZlbHMoKSwgcXJlZkRpcixyZWZTZWxlY3Rpb25QYWdlLmdldEJhc2VsaW5lTmFtZSgpLCBudWxsKTsNCgkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsNCgkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sNCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQoJCX0NCgkNCgkJbW9uaXRvci53b3JrZWQoMSk7DQoJCXJldHVybiB0cnVlOw0KCX0JDQoNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsNCgkJDQoJCXN1cGVyLmFkZFBhZ2VzKCk7DQoJCXByb2plY3QgPSBuZXcgUHJvamVjdE5hbWUoKTsNCgkJdGhpcy5hZGRQYWdlKHByb2plY3QpOwkNCgkJcmVmU2VsZWN0aW9uUGFnZSA9IGNyZWF0ZUFzc3VyUHJvalJlZmVyZW5jZVNlbGVjdGlvblBhZ2UoKTsNCgkJdGhpcy5hZGRQYWdlKHJlZlNlbGVjdGlvblBhZ2UpOwkNCgl9DQoJDQoJLyoqDQoJICogTWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuDQoJICogQHJldHVybiBwcm9qZWN0UGFnZS4NCgkgKi8NCgkvKnByb3RlY3RlZCBOZXdBc3N1clByb2pXaXphcmRQYWdlIGNyZWF0ZUFzc3VyUHJvalBhZ2UoKSB7DQoJCXJldHVybiBuZXcgTmV3QXNzdXJQcm9qV2l6YXJkUGFnZSgiTmV3IEFzc3VyYW5jZSBQcm9qZWN0Iik7DQoJfSovDQoJLyoqDQoJICogTWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuDQoJICogQHJldHVybiBwcm9qZWN0UGFnZS4NCgkgKi8NCglwcm90ZWN0ZWQgQXNzdXJQcm9qUmVmRnJhbWV3b3JrU2VsZWN0aW9uV2l6YXJkUGFnZSBjcmVhdGVBc3N1clByb2pSZWZlcmVuY2VTZWxlY3Rpb25QYWdlKCkgew0KCQlyZXR1cm4gbmV3IEFzc3VyUHJvalJlZkZyYW1ld29ya1NlbGVjdGlvbldpemFyZFBhZ2UoUkVGRVJFTkNFX0ZSQU1FV09SS19TRUxFQ1RJT04pOw0KCX0NCg0KCS8qKg0KCSAqIE1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLg0KCSAqIA0KCSAqIEBwYXJhbSBwcm9qZWN0IA0KCSAqIEByZXR1cm4NCgkgKi8NCglwcm90ZWN0ZWQgQXNzdXJQcm9qSW5pdGlhbGl6YXRpb25IZWxwZXIgY3JlYXRlUHJvamVjdEluaXRpYWxpemF0aW9uSGVscGVyKGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgZmluYWwgU3RyaW5nIGNkb0ZvbGRlciwgZmluYWwgYm9vbGVhbiBnZW5lcmF0ZUFyZ3VtZW50YXRpb24pIHsNCgkJcmV0dXJuIG5ldyBBc3N1clByb2pJbml0aWFsaXphdGlvbkhlbHBlcihwcm9qZWN0TmFtZSxjZG9Gb2xkZXIsZ2VuZXJhdGVBcmd1bWVudGF0aW9uKTsNCgl9DQoNCglwcm90ZWN0ZWQgU3RyaW5nIGdldHFyZWZEaXIoKSB7DQoJCXJldHVybiBxcmVmRGlyOw0KCX0NCg0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhcmcwLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhcmcxKSB7DQoJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCgkJDQoJfQ0KDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBhcmcwLCBTdHJpbmcgYXJnMSwNCgkJCU9iamVjdCBhcmcyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQoJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCgkJDQoJfQ0KCQ0KfQ0K