LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGw7DQoNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50YXRpb25FbGVtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb247DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRJbmZlcmVuY2U7DQoNCi8qKg0KICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NlcnRlZCBJbmZlcmVuY2U8L2I+PC9lbT4nLg0KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQogKiA8cD4NCiAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KICogPHVsPg0KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGwuQXNzZXJ0ZWRJbmZlcmVuY2VJbXBsI2dldE11bHRpZXh0ZW5zaW9uIDxlbT5NdWx0aWV4dGVuc2lvbjwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZEluZmVyZW5jZUltcGwjZ2V0Q2FyZGluYWxpdHkgPGVtPkNhcmRpbmFsaXR5PC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5pbXBsLkFzc2VydGVkSW5mZXJlbmNlSW1wbCNnZXRTb3VyY2UgPGVtPlNvdXJjZTwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZEluZmVyZW5jZUltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KICogPC91bD4NCiAqIDwvcD4NCiAqDQogKiBAZ2VuZXJhdGVkDQogKi8NCnB1YmxpYyBjbGFzcyBBc3NlcnRlZEluZmVyZW5jZUltcGwgZXh0ZW5kcyBBc3NlcnRlZFJlbGF0aW9uc2hpcEltcGwgaW1wbGVtZW50cyBBc3NlcnRlZEluZmVyZW5jZSB7DQoJLyoqDQoJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpZXh0ZW5zaW9uKCkgPGVtPk11bHRpZXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAc2VlICNnZXRNdWx0aWV4dGVuc2lvbigpDQoJICogQGdlbmVyYXRlZA0KCSAqIEBvcmRlcmVkDQoJICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uIE1VTFRJRVhURU5TSU9OX0VERUZBVUxUID0gQXNzZXJ0ZWRCeU11bHRpcGxpY2l0eUV4dGVuc2lvbi5OT1JNQUw7DQoNCgkvKioNCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FyZGluYWxpdHkoKSA8ZW0+Q2FyZGluYWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2dldENhcmRpbmFsaXR5KCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVJESU5BTElUWV9FREVGQVVMVCA9ICIiOw0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHJvdGVjdGVkIEFzc2VydGVkSW5mZXJlbmNlSW1wbCgpIHsNCgkJc3VwZXIoKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCgkJcmV0dXJuIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfSU5GRVJFTkNFOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uIGdldE11bHRpZXh0ZW5zaW9uKCkgew0KCQlyZXR1cm4gKEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24pZUR5bmFtaWNHZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX01VTFRJRVhURU5TSU9OLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0lORkVSRU5DRV9fTVVMVElFWFRFTlNJT04sIHRydWUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldE11bHRpZXh0ZW5zaW9uKEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24gbmV3TXVsdGlleHRlbnNpb24pIHsNCgkJZUR5bmFtaWNTZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX01VTFRJRVhURU5TSU9OLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0lORkVSRU5DRV9fTVVMVElFWFRFTlNJT04sIG5ld011bHRpZXh0ZW5zaW9uKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgU3RyaW5nIGdldENhcmRpbmFsaXR5KCkgew0KCQlyZXR1cm4gKFN0cmluZyllRHluYW1pY0dldChBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fQ0FSRElOQUxJVFksIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfSU5GRVJFTkNFX19DQVJESU5BTElUWSwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJcHVibGljIHZvaWQgc2V0Q2FyZGluYWxpdHkoU3RyaW5nIG5ld0NhcmRpbmFsaXR5KSB7DQoJCWVEeW5hbWljU2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19DQVJESU5BTElUWSwgQXJnUGFja2FnZS5MaXRlcmFscy5BU1NFUlRFRF9JTkZFUkVOQ0VfX0NBUkRJTkFMSVRZLCBuZXdDYXJkaW5hbGl0eSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJcHVibGljIEVMaXN0PEFyZ3VtZW50YXRpb25FbGVtZW50PiBnZXRTb3VyY2UoKSB7DQoJCXJldHVybiAoRUxpc3Q8QXJndW1lbnRhdGlvbkVsZW1lbnQ+KWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19TT1VSQ0UsIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfSU5GRVJFTkNFX19TT1VSQ0UsIHRydWUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KCXB1YmxpYyBFTGlzdDxBcmd1bWVudGF0aW9uRWxlbWVudD4gZ2V0VGFyZ2V0KCkgew0KCQlyZXR1cm4gKEVMaXN0PEFyZ3VtZW50YXRpb25FbGVtZW50PillRHluYW1pY0dldChBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fVEFSR0VULCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0lORkVSRU5DRV9fVEFSR0VULCB0cnVlLCB0cnVlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlyZXR1cm4gZ2V0TXVsdGlleHRlbnNpb24oKTsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX0NBUkRJTkFMSVRZOg0KCQkJCXJldHVybiBnZXRDYXJkaW5hbGl0eSgpOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fU09VUkNFOg0KCQkJCXJldHVybiBnZXRTb3VyY2UoKTsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX1RBUkdFVDoNCgkJCQlyZXR1cm4gZ2V0VGFyZ2V0KCk7DQoJCX0NCgkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJQE92ZXJyaWRlDQoJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCgkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX01VTFRJRVhURU5TSU9OOg0KCQkJCXNldE11bHRpZXh0ZW5zaW9uKChBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uKW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19DQVJESU5BTElUWToNCgkJCQlzZXRDYXJkaW5hbGl0eSgoU3RyaW5nKW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19TT1VSQ0U6DQoJCQkJZ2V0U291cmNlKCkuY2xlYXIoKTsNCgkJCQlnZXRTb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFyZ3VtZW50YXRpb25FbGVtZW50PiluZXdWYWx1ZSk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fVEFSR0VUOg0KCQkJCWdldFRhcmdldCgpLmNsZWFyKCk7DQoJCQkJZ2V0VGFyZ2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcmd1bWVudGF0aW9uRWxlbWVudD4pbmV3VmFsdWUpOw0KCQkJCXJldHVybjsNCgkJfQ0KCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlzZXRNdWx0aWV4dGVuc2lvbihNVUxUSUVYVEVOU0lPTl9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fQ0FSRElOQUxJVFk6DQoJCQkJc2V0Q2FyZGluYWxpdHkoQ0FSRElOQUxJVFlfRURFRkFVTFQpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX1NPVVJDRToNCgkJCQlnZXRTb3VyY2UoKS5jbGVhcigpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9JTkZFUkVOQ0VfX1RBUkdFVDoNCgkJCQlnZXRUYXJnZXQoKS5jbGVhcigpOw0KCQkJCXJldHVybjsNCgkJfQ0KCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0lORkVSRU5DRV9fTVVMVElFWFRFTlNJT046DQoJCQkJcmV0dXJuIGdldE11bHRpZXh0ZW5zaW9uKCkgIT0gTVVMVElFWFRFTlNJT05fRURFRkFVTFQ7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19DQVJESU5BTElUWToNCgkJCQlyZXR1cm4gQ0FSRElOQUxJVFlfRURFRkFVTFQgPT0gbnVsbCA/IGdldENhcmRpbmFsaXR5KCkgIT0gbnVsbCA6ICFDQVJESU5BTElUWV9FREVGQVVMVC5lcXVhbHMoZ2V0Q2FyZGluYWxpdHkoKSk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19TT1VSQ0U6DQoJCQkJcmV0dXJuICFnZXRTb3VyY2UoKS5pc0VtcHR5KCk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfSU5GRVJFTkNFX19UQVJHRVQ6DQoJCQkJcmV0dXJuICFnZXRUYXJnZXQoKS5pc0VtcHR5KCk7DQoJCX0NCgkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KCX0NCg0KfSAvL0Fzc2VydGVkSW5mZXJlbmNlSW1wbA0K