LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGw7DQoNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50RWxlbWVudDsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5Bc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkRXZpZGVuY2U7DQoNCi8qKg0KICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NlcnRlZCBFdmlkZW5jZTwvYj48L2VtPicuDQogKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCiAqIDxwPg0KICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZEV2aWRlbmNlSW1wbCNnZXRNdWx0aWV4dGVuc2lvbiA8ZW0+TXVsdGlleHRlbnNpb248L2VtPn08L2xpPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGwuQXNzZXJ0ZWRFdmlkZW5jZUltcGwjZ2V0Q2FyZGluYWxpdHkgPGVtPkNhcmRpbmFsaXR5PC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5pbXBsLkFzc2VydGVkRXZpZGVuY2VJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5pbXBsLkFzc2VydGVkRXZpZGVuY2VJbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4NCiAqIDwvdWw+DQogKiA8L3A+DQogKg0KICogQGdlbmVyYXRlZA0KICovDQpwdWJsaWMgY2xhc3MgQXNzZXJ0ZWRFdmlkZW5jZUltcGwgZXh0ZW5kcyBBc3NlcnRlZFJlbGF0aW9uc2hpcEltcGwgaW1wbGVtZW50cyBBc3NlcnRlZEV2aWRlbmNlIHsNCgkvKioNCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlleHRlbnNpb24oKSA8ZW0+TXVsdGlleHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2dldE11bHRpZXh0ZW5zaW9uKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24gTVVMVElFWFRFTlNJT05fRURFRkFVTFQgPSBBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uLk5PUk1BTDsNCg0KCS8qKg0KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXJkaW5hbGl0eSgpIDxlbT5DYXJkaW5hbGl0eTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHNlZSAjZ2V0Q2FyZGluYWxpdHkoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKiBAb3JkZXJlZA0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUkRJTkFMSVRZX0VERUZBVUxUID0gIiI7DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwcm90ZWN0ZWQgQXNzZXJ0ZWRFdmlkZW5jZUltcGwoKSB7DQoJCXN1cGVyKCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQoJCXJldHVybiBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0VWSURFTkNFOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uIGdldE11bHRpZXh0ZW5zaW9uKCkgew0KCQlyZXR1cm4gKEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24pZUR5bmFtaWNHZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fTVVMVElFWFRFTlNJT04sIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfRVZJREVOQ0VfX01VTFRJRVhURU5TSU9OLCB0cnVlLCB0cnVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgdm9pZCBzZXRNdWx0aWV4dGVuc2lvbihBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uIG5ld011bHRpZXh0ZW5zaW9uKSB7DQoJCWVEeW5hbWljU2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX01VTFRJRVhURU5TSU9OLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0VWSURFTkNFX19NVUxUSUVYVEVOU0lPTiwgbmV3TXVsdGlleHRlbnNpb24pOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKSB7DQoJCXJldHVybiAoU3RyaW5nKWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX0NBUkRJTkFMSVRZLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0VWSURFTkNFX19DQVJESU5BTElUWSwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0Q2FyZGluYWxpdHkoU3RyaW5nIG5ld0NhcmRpbmFsaXR5KSB7DQoJCWVEeW5hbWljU2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX0NBUkRJTkFMSVRZLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0VWSURFTkNFX19DQVJESU5BTElUWSwgbmV3Q2FyZGluYWxpdHkpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCXB1YmxpYyBFTGlzdDxBcmd1bWVudEVsZW1lbnQ+IGdldFNvdXJjZSgpIHsNCgkJcmV0dXJuIChFTGlzdDxBcmd1bWVudEVsZW1lbnQ+KWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX1NPVVJDRSwgQXJnUGFja2FnZS5MaXRlcmFscy5BU1NFUlRFRF9FVklERU5DRV9fU09VUkNFLCB0cnVlLCB0cnVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCglwdWJsaWMgRUxpc3Q8QXJndW1lbnRFbGVtZW50PiBnZXRUYXJnZXQoKSB7DQoJCXJldHVybiAoRUxpc3Q8QXJndW1lbnRFbGVtZW50PillRHluYW1pY0dldChBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19UQVJHRVQsIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfRVZJREVOQ0VfX1RBUkdFVCwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlyZXR1cm4gZ2V0TXVsdGlleHRlbnNpb24oKTsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fQ0FSRElOQUxJVFk6DQoJCQkJcmV0dXJuIGdldENhcmRpbmFsaXR5KCk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX1NPVVJDRToNCgkJCQlyZXR1cm4gZ2V0U291cmNlKCk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX1RBUkdFVDoNCgkJCQlyZXR1cm4gZ2V0VGFyZ2V0KCk7DQoJCX0NCgkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCgkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fTVVMVElFWFRFTlNJT046DQoJCQkJc2V0TXVsdGlleHRlbnNpb24oKEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24pbmV3VmFsdWUpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fQ0FSRElOQUxJVFk6DQoJCQkJc2V0Q2FyZGluYWxpdHkoKFN0cmluZyluZXdWYWx1ZSk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19TT1VSQ0U6DQoJCQkJZ2V0U291cmNlKCkuY2xlYXIoKTsNCgkJCQlnZXRTb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFyZ3VtZW50RWxlbWVudD4pbmV3VmFsdWUpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fVEFSR0VUOg0KCQkJCWdldFRhcmdldCgpLmNsZWFyKCk7DQoJCQkJZ2V0VGFyZ2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcmd1bWVudEVsZW1lbnQ+KW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCX0NCgkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlzZXRNdWx0aWV4dGVuc2lvbihNVUxUSUVYVEVOU0lPTl9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19DQVJESU5BTElUWToNCgkJCQlzZXRDYXJkaW5hbGl0eShDQVJESU5BTElUWV9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19TT1VSQ0U6DQoJCQkJZ2V0U291cmNlKCkuY2xlYXIoKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX1RBUkdFVDoNCgkJCQlnZXRUYXJnZXQoKS5jbGVhcigpOw0KCQkJCXJldHVybjsNCgkJfQ0KCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlyZXR1cm4gZ2V0TXVsdGlleHRlbnNpb24oKSAhPSBNVUxUSUVYVEVOU0lPTl9FREVGQVVMVDsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9FVklERU5DRV9fQ0FSRElOQUxJVFk6DQoJCQkJcmV0dXJuIENBUkRJTkFMSVRZX0VERUZBVUxUID09IG51bGwgPyBnZXRDYXJkaW5hbGl0eSgpICE9IG51bGwgOiAhQ0FSRElOQUxJVFlfRURFRkFVTFQuZXF1YWxzKGdldENhcmRpbmFsaXR5KCkpOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0VWSURFTkNFX19TT1VSQ0U6DQoJCQkJcmV0dXJuICFnZXRTb3VyY2UoKS5pc0VtcHR5KCk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfRVZJREVOQ0VfX1RBUkdFVDoNCgkJCQlyZXR1cm4gIWdldFRhcmdldCgpLmlzRW1wdHkoKTsNCgkJfQ0KCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQp9IC8vQXNzZXJ0ZWRFdmlkZW5jZUltcGwNCg==