LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUxpc3RlbmVyOwovKioKICogQSBtb2R1bGUgaXMgYSB1bml0IG9mICJjb250ZW50IiB0aGF0IGNhbiBiZSBwdWJsaXNoZWQgdG8gYQogKiBzZXJ2ZXIuCiAqIDxwPgogKiBBbGwgbW9kdWxlcyBoYXZlIGEgbW9kdWxlIHR5cGUsIHdoaWNoIGlzIGZpeGVkIGZvciB0aGUKICogbGlmZXRpbWUgb2YgdGhlIG1vZHVsZS4gVGhlIHNldCBvZiBtb2R1bGUgdHlwZXMgKG9yCiAqICJraW5kcyIpIGlzIG9wZW4tZW5kZWQuCiAqIDwvcD4KICogPHA+CiAqIEFsbCBtb2R1bGVzIGFyZSBjcmVhdGVkIGJ5IG1vZHVsZSBmYWN0b3JpZXMgdXNpbmcgdGhlIG1vZHVsZUZhY3RvcmllcwogKiBleHRlbnNpb24gcG9pbnQuCiAqIDwvcD4KICogPHA+CiAqIFRoZSBjb250ZW50IG9mIGEgbW9kdWxlIGlzIGEgY29sbGVjdGlvbiBvZiBmaWxlIGFuZCBmb2xkZXIKICogcmVzb3VyY2VzIGluIHRoZSB3b3Jrc3BhY2UuCiAqIDwvcD4KICogPHA+CiAqIEluIHByaW5jaXBsZSwgYSBtb2R1bGUgZXhpc3RzIGluZGVwZW5kZW50IG9mIGFueQogKiBwYXJ0aWN1bGFyIHNlcnZlci4gVGhlIHNhbWUgbW9kdWxlIGluc3RhbmNlIGNhbiBiZSBhc3NvY2lhdGVkCiAqIHdpdGggbXVsdGlwbGUgc2VydmVyIGluc3RhbmNlcyBhdCB0aGUgc2FtZSB0aW1lLiBUaGF0IGlzCiAqIHdoeSB5b3UgY2Fubm90IGFzayB0aGUgbW9kdWxlIHdoaWNoIHNlcnZlciBpdCdzIGFzc29jaWF0ZWQKICogd2l0aC4KICogPC9wPgogKiA8cD4KICogW2lzc3VlOiBFcXVhbGl0eS9pZGVudGlmeSBmb3IgbW9kdWxlcz9dCiAqIDwvcD4KICogPHA+CiAqIENvbmNyZXRlIG1vZHVsZSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYnkgY29uY3JldGUgY2xhc3NlcwogKiBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UuIFRoZSBvbmx5IGxlZ2l0aW1hdGUgcmVhc29uCiAqIHRvIGRlY2xhcmUgYSBzdWJjbGFzcyBpcyB0byBpbXBsZW1lbnQgYSBtb2R1bGUgZmFjdG9yeS4KICogPC9wPgogKiA8cD4KICogPGl0PkNhdmVhdDogVGhlIHNlcnZlciBjb3JlIEFQSSBpcyBzdGlsbCBpbiBhbiBlYXJseSBmb3JtLCBhbmQgaXMKICogbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSB0aGUgaW5pdGlhbCByZWxlYXNlLjwvaXQ+CiAqIDwvcD4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBpbnRlcmZhY2UgSU1vZHVsZSBleHRlbmRzIElBZGFwdGFibGUgewoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vZHVsZS4KCSAqIEVhY2ggbW9kdWxlIGhhcyBhIGRpc3RpbmN0IGlkLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoaXMKCSAqIG1vZHVsZSBmcm9tIGFsbCBvdGhlciBtb2R1bGVzIGluIHRoZSB3b3Jrc3BhY2UgKGFuZAoJICogd2l0aGluIGEgc2VydmVyKS4gSWRzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkKCSAqIGFzIGtleXM7IHRoZXkgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzaG93biB0byBlbmQgdXNlcnMuCgkgKiAKCSAqIEByZXR1cm4gdGhlIG1vZHVsZSBpZAoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCk7CgoJLyoqCgkgKiBWYWxpZGF0ZXMgdGhpcyBtb2R1bGUuCgkgKiA8cD4KCSAqIFtpc3N1ZTogQ29uamVjdHVyZTogRWFjaCBkaWZmZXJlbnQgdHlwZSBvZiBtb2R1bGUgcHJlc2NyaWJlcwoJICogbGVnYWwgYXJyYW5nZW1lbnRzIG9mLCBhbmQgdGhlIHNpZ25pZmljYW5jZSBvZiwgdGhlIGZpbGVzIHdpdGhpbgoJICogaXQuIFRoaXMgd291bGQgYmUgc3BlbGxlZCBvdXQgaW4gdGhlIHNwZWMgZm9yIHRoZSBwYXJ0aWN1bGFyCgkgKiBtb2R1bGUgdHlwZXMuCgkgKiBUaGlzIHZhbGlkYXRlIG9wZXJhdGlvbiBpcyBzdXBwb3NlIHRvIGNoZWNrIHRoZSBhY3R1YWwKCSAqIGFycmFuZ2VtZW50IG9mIGZpbGVzIGluIHRoaXMgbW9kdWxlIHRvIHNlZSB3aGV0aGVyIHRoZXkKCSAqIG1lZXQgZXhwZWN0YXRpb25zLgoJICogSXQncyBhbiBvcGVuIHF1ZXN0aW9uIGFzIHRvIGhvdyAic3RyZW51b3VzIiBhIGNoZWNrIHRoaXMKCSAqIGlzLl0KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBPbGQgY29tbWVudCBzYWlkOiAiSWYgdGhlcmUgaXMgYW4gZXJyb3IKCSAqIHRoYXQgc2hvdWxkIGJsb2NrIHRoZSBzZXJ2ZXIgZnJvbSBzdGFydGluZyAoZS5nLiBtYWpvciBlcnJvcnMpCgkgKiBpdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCB0bwoJICogcmV0dXJuIHdhcm5pbmcgZm9yIHN1Y2ggdGhpbmdzIGFzIGFuIG9wZW4gKGFuZCBkaXJ0eSkgZWRpdG9yLiJdCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogQWxsIGV4aXN0aW5nIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHJldHVybiBudWxsLAoJICogd2hpY2ggaXMgaWxsZWdhbC5dCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogT2xkIGNvbW1lbnQgc2FpZDogIlJldHVybnMgYW4gSVN0YXR1cyB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgb2JqZWN0IGNhbgoJICogYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIiBTaW5jZSB0aGUgc2FtZSBtb2R1bGUgY2FuCgkgKiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IG51bWJlciBvZiBzZXJ2ZXJzLCAidGhlIHNlcnZlciIgaXMKCSAqIGlsbC1kZWZpbmVkLl0KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBPbGQgY29tbWVudCBzYWlkOiAiU2hvdWxkIHJldHVybiBhbiBlcnJvciBpZiB0aGVyZQoJICogaXMgYSBtYWpvciBwcm9ibGVtIHdpdGggdGhlIHJlc291cmNlcywgb3IgY2FuIGJlIHVzZWQgdG8KCSAqIHJldHVybiB3YXJuaW5ncyBvbiB1bnNhdmVkIGZpbGVzLCBldGMuIiBJdCBpcyB1c3VhbGx5CgkgKiBkaWZmaWN1bHQgaW4gcHJpbmNpcGxlIGZvciBjb3JlLWxldmVsIGluZnJhc3RydWN0dXJlIHRvCgkgKiBkZXRlY3Qgd2hldGhlciB0aGVyZSBhcmUgb3BlbiBlZGl0b3JzIHdpdGggdW5zYXZlZCBjaGFuZ2VzLl0KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIGdpdmVuCgkgKiBtb2R1bGUgaXMgdmFsaWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzCgkgKiB3cm9uZyB3aXRoIGl0CgkgKi8KCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSByb290IHJlc291cmNlcyBvZiB0aGlzIG1vZHVsZS4gQWxsIG1lbWJlcnMKICAgICAqIGJlbG9uZyB0byB0aGlzIG1vZHVsZSAoYXMgZG8gdGhlaXIgbWVtYmVycywgYW5kIHNvIG9uKS4KCSAqIDxwPgoJICogW2lzc3VlOiBXaGF0IGFyZSB0aGUgZXhhY3QgY29uc3RyYWludHMgb24gd2hlcmUgdGhlc2UKCSAqIHJlc291cmNlcyBhcmUgbG9jYXRlZD8KCSAqIERvIHRoZXkgYWxsIGhhdmUgdG8gYmUgaW5zaWRlIHRoZSB3b3Jrc3BhY2U/CgkgKiBEbyB0aGV5IGFsbCBoYXZlIHRvIGJlIGluIHRoZSBzYW1lIHByb2plY3Q/CgkgKiBXaGVuIGEgZm9sZGVyIGlzIGluY2x1ZGVkLCBkb2VzIHRoYXQgbWVhbiB0aGUgZW50aXJlCgkgKiBzdWJ0cmVlIGlzIHB1Ymxpc2hlZCB0byBzZXJ2ZXI/XQoJICogPC9wPgoJICogCgkgKiBAcmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoaXMgbW9kdWxlCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gW21pc3NpbmddCgkgKi8KCS8vcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlLgoJICogPHA+CgkgKiBOb3RlIHRoYXQgdGhpcyBuYW1lIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBsb2NhbGUuCgkgKiA8L3A+CgkgKgoJICogQHJldHVybiBhIGRpc3BsYXlhYmxlIG5hbWUgZm9yIHRoaXMgbW9kdWxlCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIG1vZHVsZS4KCSAqIAoJICogQHJldHVybgoJICovCglwdWJsaWMgSU1vZHVsZVR5cGUgZ2V0TW9kdWxlVHlwZSgpOwoKCS8qKgoJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbW9kdWxlIGN1cnJlbnRseSBleGlzdHMuCgkgKiA8cD4KCSAqIFtpc3N1ZTogVGhlIG1ldGhvZCB0b3VjaGVzIG9uIHRoZSBpbXBvcnRhbnQgcHJvYmxlbQoJICogb2Ygd2hlbiBhIG1vZHVsZSBjZWFzZXMgdG8gZXhpc3QuIE5lZWQgdG8gZXhwbGFpbgoJICogdGhlIGZ1bGwgbGlmZWN5Y2xlIG9mIGEgbW9kdWxlLgoJICogU2hvdWxkIGl0IGJlIHN5bm9ueW1vdXMgd2l0aCB0aGUgbW9kdWxlIHJvb3QgCgkgKiBJQ29udGFpbmVyLmV4aXN0cygpPyBUaGF0IGlzLCB0aGUgbW9kdWxlIGV4aXN0cwoJICogYXMgbG9uZyBhcyB0aGUgSUNvbnRhaW5lciB0aGF0IGhvbGRzIGFsbCBpdHMgbW9kdWxlCgkgKiByZXNvdXJjZXMgZXhpc3RzKCk/XQoJICogPC9wPgoJICoKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdGhpcyBtb2R1bGUgY3VycmVudGx5IGV4aXN0cywgYW5kCgkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaGFzIGJlZW4gZGVsZXRlZCBvciBtb3ZlZAoJICovCgkvL3B1YmxpYyBib29sZWFuIGV4aXN0cygpOwoJCgkvKioKCSAqIFJldHVybnMgdGhlIHdvcmtiZW5jaCBwcm9qZWN0IHRoYXQgdGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluLAoJICogb3IgbnVsbCBpZiB0aGUgbW9kdWxlIGlzIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZS4KCSAqIAoJICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdAoJICovCglwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwoKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoaWxkIG1vZHVsZSB0aGF0IGFyZSBhZGRlZC9yZW1vdmVkIGZyb20gdGhpcwoJICogbW9kdWxlLgoJICogSGFzIG5vIGVmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgoJICogCgkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCBhZGRNb2R1bGVMaXN0ZW5lcihJTW9kdWxlTGlzdGVuZXIgbGlzdGVuZXIpOwoKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIGNoaWxkIG1vZHVsZXMgdGhhdCBhcmUgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoaXMKCSAqIG1vZHVsZS4KCSAqIEhhcyBubyBlZmZlY3QgaWYgdGhlIGxpc3RlbmVyIGlzIG5vdCByZWdpc3RlcmVkLgoJICogCgkgKiBAcGFyYW0gbGlzdGVuZXIgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCByZW1vdmVNb2R1bGVMaXN0ZW5lcihJTW9kdWxlTGlzdGVuZXIgbGlzdGVuZXIpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgY2hpbGQgbW9kdWxlcyBvZiB0aGlzIG1vZHVsZS4KCSAqCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlW10KCSAqLwoJcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKfQ==