LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci8qKgogKiBSZXByZXNlbnRzIGEgc2VydmVyIGluc3RhbmNlLiBFdmVyeSBzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgYQogKiBwYXJ0aWN1bGFyLCBmaXhlZCBzZXJ2ZXIgdHlwZS4KICogPHA+CiAqIE5vdCBzdXJwcmlzaW5nbHksIHRoZSBub3Rpb24gb2YgPGI+c2VydmVyPC9iPiBpcyBjZW50cmFsIGluIHRoZSB3ZWIgdG9vbHMKICogc2VydmVyIGluZnJhc3RydWN0dXJlLiBJbiB0aGlzIGNvbnRleHQsIHVuZGVyc3RhbmQgdGhhdCBhIHNlcnZlciBpcwogKiBhIHdlYiBzZXJ2ZXIgb2Ygc29tZSBpbGsuIEl0IGNvdWxkIGJlIGEgc2ltcGxlIHdlYiBzZXJ2ZXIgbGFja2luZyBKYXZhCiAqIHN1cHBvcnQsIG9yIGFuIEoyRUUgYmFzZWQgc2VydmVyLCBvciBwZXJoYXBzIGV2ZW4gc29tZSBraW5kIG9mIGRhdGFiYXNlCiAqIHNlcnZlci4gQSBtb3JlIGV4YWN0IGRlZmluaXRpb24gaXMgbm90IHJlcXVpcmVkIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBBUEkuCiAqIEZyb20gYSB0b29sLWNlbnRyaWMgcG9pbnQgb2YgdmlldywgYSBzZXJ2ZXIKICogaXMgc29tZXRoaW5nIHRoYXQgdGhlIGRldmVsb3BlciBpcyB3cml0aW5nICJjb250ZW50IiBmb3IuCiAqIFRoZSB1bml0IG9mIGNvbnRlbnQgaXMgdGVybWVkIGEgbW9kdWxlLgogKiBJbiBhIHNlbnNlLCB0aGUgc2VydmVyIGV4aXN0cywgYnV0IGxhY2tzIHVzZWZ1bCBjb250ZW50LiBUaGUKICogZGV2ZWxvcG1lbnQgdGFzayBpcyB0byBwcm92aWRlIHRoYXQgY29udGVudC4gVGhlIGNvbnRlbnQgY2FuIGluY2x1ZGUKICogYW55dGhpbmcgZnJvbSBzaW1wbGUsIHN0YXRpYyBIVE1MIHdlYiBwYWdlcyB0byBjb21wbGV4LCBoaWdobHkgZHluYW1pYwogKiB3ZWIgYXBwbGljYXRpb25zLgogKiBJbiB0aGUgY291cnNlIG9mIHdyaXRpbmcgYW5kIGRlYnVnZ2luZyB0aGlzIGNvbnRlbnQsCiAqIHRoZSBkZXZlbG9wZXIgd2lsbCB3YW50IHRvIHRlc3QgdGhlaXIgY29udGVudCBvbiBhIHdlYiBzZXJ2ZXIsIHRvIHNlZSBob3cgaXQKICogZ2V0cyBzZXJ2ZWQgdXAuIEZvciB0aGlzIHRoZXkgd2lsbCBuZWVkIHRvIGxhdW5jaCBhIHNlcnZlciBwcm9jZXNzIHJ1bm5pbmcgb24KICogc29tZSBob3N0IG1hY2hpbmUgKG9mdGVuIHRoZSBsb2NhbCBob3N0IG9uIHdoaWNoIHRoZSBJREUgaXMgcnVubmluZyksIG9yCiAqIGF0dGFjaCB0byBhIHNlcnZlciB0aGF0J3MgYWxyZWFkeSBydW5uaW5nIG9uIGEgcmVtb3RlIChvciBsb2NhbCkgaG9zdC4gCiAqIFRoZSBuZXdseSBkZXZlbG9wZWQgY29udGVudCBzaXR0aW5nIGluIHRoZSBkZXZlbG9wZXIncyB3b3Jrc3BhY2UgbmVlZHMgdG8KICogZW5kIHVwIGluIGEgbG9jYXRpb24gYW5kIGZvcm1hdCB0aGF0IHRoZSBydW5uaW5nIHNlcnZlciBjYW4gdXNlIGZvciBpdHMKICogc2VydmluZyBwdXJwb3Nlcy4KICogPC9wPgogKiA8cD4KICogSW4gdGhpcyBwaWN0dXJlLCBhbiA8Y29kZT5JU2VydmVyPC9jb2RlPiBvYmplY3QgaXMgYSBwcm94eSBmb3IgdGhlIHJlYWwgd2ViCiAqIHNlcnZlci4gVGhyb3VnaCB0aGlzIHByb3h5LCBhIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSBzZXJ2ZXIsIGFuZCBzdGFydCwKICogc3RvcCwgYW5kIHJlc3RhcnQgaXQuCiAqIDwvcD4KICogPHA+CiAqIFRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG1haW50YWlucyBhIGdsb2JhbCBsaXN0IG9mIGFsbCBrbm93biBzZXJ2ZXIgaW5zdGFuY2VzCiAqICh7QGxpbmsgU2VydmVyQ29yZSNnZXRTZXJ2ZXJzKCl9KS4KICogPC9wPgogKiA8cD4KICogW3JvdWdoIG5vdGVzOgogKiBTZXJ2ZXIgaGFzIGEgc3RhdGUuCiAqIFNlcnZlciBjYW4gYmUgc3RhcnRlZCwgc3RvcHBlZCwgYW5kIHJlc3RhcnRlZC4KICogVG8gbW9kaWZ5IHNlcnZlciBhdHRyaWJ1dGVzLCBnZXQgYSB3b3JraW5nIGNvcHksIG1vZGlmeSBpdCwgYW5kIHRoZW4gc2F2ZSBpdAogKiB0byBjb21taXQgdGhlIGNoYW5nZXMuCiAqIFNlcnZlciBhdHRyaWJ1dGVzLiBTZXJpYWxpemF0aW9uLgogKiBDaGFpbmVkIHdvcmtpbmcgY29waWVzIGZvciBydW50aW1lLCBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KICogU2VydmVyIGhhcyBhIHNldCBvZiByb290IG1vZHVsZXMuCiAqIE1vZHVsZXMgaGF2ZSBzdGF0ZSB3cnQgYSBzZXJ2ZXIuCiAqIFJlc3RhcnRpbmcgbW9kdWxlcy4KICogXQogKiA8L3A+CiAqIDxwPgogKiBbaXNzdWU6IFRoZSBpbmZvcm1hdGlvbiBhY3R1YWxseSBzdG9yZWQgaW4gdGhlICguc2VydmVyKSBmaWxlIGlzOgogKiBzZXJ2ZXIgaWQgYW5kIG5hbWUsIHNlcnZlciB0eXBlIGlkLCBydW50aW1lIGlkLCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpZCwKICogYW5kIHRlc3QtZW52aXJvbm1lbnQuIEl0J3MgdW5jbGVhciB3aGF0J3MgZ2FpbmVkIGJ5IHN0b3JpbmcgdGhpcwogKiBpbmZvcm1hdGlvbiBpbiBhIHdvcmtzcGFjZSBmaWxlLiBJcyBpdCBzbyB0aGF0IHRoaXMgaW5mb3JtYXRpb24KICogY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIHVzZXJzIHZpYSBhIHJlcG9zaXRvcnk/IE9yIGlzIGl0IGp1c3Qgc28gdGhhdAogKiB0aGVyZSB3b3VsZCBiZSBzb21ldGhpbmcgdG8gb3BlbiBpbiB0aGUgcmVzb3VyY2UgbmF2aWdhdG9yIHZpZXc/XQogKiA8L3A+CiAqIDxwPgogKiBbaXNzdWU6IEVxdWFsaXR5L2lkZW50aWZ5IGZvciBzZXJ2ZXJzP10KICogPC9wPgogKiAKICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgogKiA8cD4KICogPGl0PkNhdmVhdDogVGhlIHNlcnZlciBjb3JlIEFQSSBpcyBzdGlsbCBpbiBhbiBlYXJseSBmb3JtLCBhbmQgaXMKICogbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSB0aGUgaW5pdGlhbCByZWxlYXNlLjwvaXQ+CiAqIDwvcD4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckF0dHJpYnV0ZXMgZXh0ZW5kcyBJRWxlbWVudCwgSUFkYXB0YWJsZSB7CgkvKioKCSAqIEZpbGUgZXh0ZW5zaW9uICh2YWx1ZSAic2VydmVyIikgZm9yIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YKCSAqIHNlcnZlciBpbnN0YW5jZXMuCgkgKiA8cD4KCSAqIFtpc3N1ZTogV2hhdCBpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIGZpbGUgZXh0ZW5zaW9uIGFuZAoJICogdGhlIGZpbGUgcGFzc2VkIHRvIElTZXJ2ZXJUeXBlLmNyZWF0ZSguLi4pIG9yIHJldHVybmVkIGJ5CgkgKiBJU2VydmVyLmdldEZpbGUoKT8gVGhhdCBpcywgYXJlIHNlcnZlciBmaWxlcyBleHBlY3RlZCB0byBlbmQKCSAqIGluICIuc2VydmVyIiwgb3IgaXMgdGhpcyBqdXN0IGEgZGVmYXVsdD8gSWYgdGhlIGZvcm1lcgoJICogKGFzIEkgc3VzcGVjdCksIHRoZW4gSVNlcnZlclR5cGUuY3JlYXRlIG5lZWRzIHRvIHNheSBzbywKCSAqIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGVuZm9yY2UgdGhlIHJlc3RyaWN0aW9uLl0KCSAqIDwvcD4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRFTlNJT04gPSAic2VydmVyIjsKCgkvKioKCSAqIFNlcnZlciBpZCBhdHRyaWJ1dGUgKHZhbHVlICJzZXJ2ZXItaWQiKSBvZiBsYXVuY2ggY29uZmlndXJhdGlvbnMuCgkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRhZyBhIGxhdW5jaCBjb25maWd1cmF0aW9uIHdpdGggdGgKCSAqIGlkIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZlci4KCSAqIDxwPgoJICogW2lzc3VlOiBUaGlzIGZlZWxzIGxpa2UgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiBJZiBpdCBpcyB0bwoJICogcmVtYWluIEFQSSwgbmVlZCB0byBleHBsYWluIGhvdyBhIGNsaWVudCB1c2VzIHRoaXMgYXR0cmlidXRlLl0KCSAqIDwvcD4KCSAqIEBzZWUgSUxhdW5jaENvbmZpZ3VyYXRpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJWRVJfSUQgPSAic2VydmVyLWlkIjsKCgkvKioKCSAqIFJldHVybnMgdGhlIGhvc3QgZm9yIHRoZSBzZXJ2ZXIuCgkgKiBUaGUgZm9ybWF0IG9mIHRoZSBob3N0IGNhbiBiZSBlaXRoZXIgYSBxdWFsaWZpZWQgb3IgdW5xdWFsaWZpZWQgaG9zdG5hbWUsCgkgKiBvciBhbiBJUCBhZGRyZXNzIGFuZCBtdXN0IGNvbmZvcm0gdG8gUkZDIDI3MzIuCgkgKiAKCSAqIEByZXR1cm4gYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCgkgKiBAc2VlIGphdmEubmV0LlVSTC5nZXRIb3N0KCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRIb3N0KCk7CgkKCS8qKgoJICogUmV0dXJucyB0aGUgZmlsZSB3aGVyZSB0aGlzIHNlcnZlciBpbnN0YW5jZSBpcyBzZXJpYWxpemVkLgoJICogCgkgKiBAcmV0dXJuIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQoJICogaXMgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCgkgKiBpbnN0ZWFkIHRvIGJlIHBlcnNpc3RlZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnV0IG5vdCB3aXRoIGFueQoJICogcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKCSAqLwoJcHVibGljIElGaWxlIGdldEZpbGUoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KCSAqIDxwPgoJICogTm90ZTogVGhlIHJ1bnRpbWUgb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heSBvciBtYXkgbm90CgkgKiBiZSBhIHdvcmtpbmcgY29weS4gRm9yIGEgc2VydmVyIGluc3RhbmNlIHRoYXQgaXMgbm90IGEKCSAqIHdvcmtpbmcgY29weSwgdGhlIHJ1bnRpbWUgaW5zdGFuY2UgaXMgbm90IGEgd29ya2luZyBjb3B5CgkgKiBlaXRoZXIuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogQWNjb3JkaW5nIHRvIHNlcnZlclR5cGUgZXh0ZW5zaW9uIHBvaW50LCAKCSAqIHJ1bnRpbWVUeXBlSWQgaXMgYSBtYW5kYXRvcnkgYXR0cmlidXRlLiBJdCBzZWVtcyBvZGQKCSAqIHRoZW4gdG8gaGF2ZSBzZXJ2ZXIgcnVudGltZSBpbnN0YW5jZSBiZWluZyBhbgoJICogb3B0aW9uYWwgcHJvcGVydHkgb2Ygc2VydmVyIGluc3RhbmNlLiBXaGF0IGRvZXMgaXQgbWVhbgoJICogZm9yIGEgc2VydmVyIHRvIG5vdCBoYXZlIGEgcnVudGltZT9dCgkgKiA8L3A+CgkgKiAKCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKCSAqLwoJcHVibGljIElSdW50aW1lIGdldFJ1bnRpbWUoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgc2VydmVyLgoJICogCgkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgdHlwZQoJICovCglwdWJsaWMgSVNlcnZlclR5cGUgZ2V0U2VydmVyVHlwZSgpOwoJCgkvKioKCSAqIFJldHVybnMgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZlci4KCSAqIDxwPgoJICogTm90ZTogVGhlIHNlcnZlciBjb25maWd1cmF0aW9uIG9mIGEgc2VydmVyIHdvcmtpbmcgY29weSBtYXkKCSAqIG9yIG1heSBub3QgYmUgYSB3b3JraW5nIGNvcHkuIEZvciBhIHNlcnZlciBpbnN0YW5jZSB0aGF0IGlzCgkgKiBub3QgYSB3b3JraW5nIGNvcHksIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBpcyBub3QKCSAqIGEgd29ya2luZyBjb3B5IGVpdGhlci4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAoJICogY29uZmlndXJhdGlvblR5cGVJZCBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUuIElmIGEgc2VydmVyIHR5cGUKCSAqIGhhcyBubyBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLCB0aGVuIGl0IHNlZW1zIHJlYXNvbmFibGUgdG8gCgkgKiBleHBlY3QgdGhpcyBtZXRob2QgdG8gcmV0dXJuIG51bGwgZm9yIGFsbCBpbnN0YW5jZXMgb2YgdGhhdCBzZXJ2ZXIKCSAqIHR5cGUuIEJ1dCB3aGF0IGFib3V0IGEgc2VydmVyIHR5cGUgdGhhdCBleHBsaWNpdGx5IHNwZWNpZmllcwoJICogYSBzZXJ2ZXIgY29uZmlndXJhdGlvbiB0eXBlLiBEb2VzIHRoYXQgbWVhbiB0aGF0IGFsbCBzZXJ2ZXIKCSAqIGluc3RhbmNlcyBvZiB0aGF0IHNlcnZlciB0eXBlIG11c3QgaGF2ZSBhIHNlcnZlciBjb25maWd1cmF0aW9uCgkgKiBpbnN0YW5jZSBvZiB0aGF0IHNlcnZlciBjb25maWd1cmF0aW9uIHR5cGUsIGFuZCB0aGF0IHRoaXMgbWV0aG9kCgkgKiBuZXZlciByZXR1cm5zIG51bGwgaW4gdGhvc2UgY2FzZXM/XQoJICogPC9wPgoJICogCgkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQoJICovCglwdWJsaWMgSUZvbGRlciBnZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgZXh0ZW5zaW9uIGZvciB0aGlzIHNlcnZlci4KCSAqIFRoZSBzZXJ2ZXIgZXh0ZW5zaW9uIGlzIGEgc2VydmVyLXR5cGUtc3BlY2lmaWMgb2JqZWN0LgoJICogQnkgY2FzdGluZyB0aGUgc2VydmVyIGV4dGVuc2lvbiB0byB0aGUgdHlwZSBwcmVzY3JpYmVkIGluCgkgKiB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcGFydGljdWxhciBzZXJ2ZXIgdHlwZSwgCgkgKiB0aGUgY2xpZW50IGNhbiBhY2Nlc3Mgc2VydmVyLXR5cGUtc3BlY2lmaWMgcHJvcGVydGllcyBhbmQKCSAqIG1ldGhvZHMuCgkgKiAKCSAqIEByZXR1cm4gdGhlIHNlcnZlciBleHRlbnNpb24KCSAqLwoJLy9wdWJsaWMgSVNlcnZlckV4dGVuc2lvbiBnZXRFeHRlbnNpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKCgkvKioKCSAqIFJldHVybnMgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IGZvciBtb2RpZnlpbmcgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UuCgkgKiBJZiB0aGlzIGluc3RhbmNlIGlzIGFscmVhZHkgYSB3b3JraW5nIGNvcHksIGl0IGlzIHJldHVybmVkLgoJICogSWYgdGhpcyBpbnN0YW5jZSBpcyBub3QgYSB3b3JraW5nIGNvcHksIGEgbmV3IHNlcnZlciB3b3JraW5nIGNvcHkKCSAqIGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBpZCBhbmQgYXR0cmlidXRlcy4KCSAqIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcgb3IgcmVsZWFzaW5nIHRoZSB3b3JraW5nIGNvcHkgd2hlbgoJICogdGhleSBhcmUgZG9uZSB3aXRoIGl0LgoJICogPHA+CgkgKiBUaGUgc2VydmVyIHdvcmtpbmcgY29weSBpcyByZWxhdGVkIHRvIHRoaXMgc2VydmVyIGluc3RhbmNlCgkgKiBpbiB0aGUgZm9sbG93aW5nIHdheXM6CgkgKiA8cHJlPgoJICogdGhpcy5nZXRXb3JraW5nQ29weSgpLmdldElkKCkgPT0gdGhpcy5nZXRJZCgpCgkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0RmlsZSgpID09IHRoaXMuZ2V0RmlsZSgpCgkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0T3JpZ2luYWwoKSA9PSB0aGlzCgkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0UnVudGltZSgpID09IHRoaXMuZ2V0UnVudGltZSgpCgkgKiB0aGlzLmdldFdvcmtpbmdDb3B5KCkuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpID09IHRoaXMuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpCgkgKiA8L3ByZT4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBJU2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJU2VydmVyLiAKCSAqIFNlcnZlci5nZXRXb3JraW5nQ29weSgpIGNyZWF0ZSBhIG5ldyB3b3JraW5nIGNvcHk7CgkgKiBTZXJ2ZXJXb3JraW5nQ29weS5nZXRXb3JraW5nQ29weSgpIHJldHVybnMgdGhpcy4KCSAqIFRoaXMgbWF5IGJlIGNvbnZlbmllbnQgaW4gY29kZSB0aGF0IGlzIGlnbm9yYW50IG9mCgkgKiB3aGV0aGVyIHRoZXkgYXJlIGRlYWxpbmcgd2l0aCBhIHdvcmtpbmcgY29weSBvciBub3QuCgkgKiBIb3dldmVyLCBpdCBpcyBoYXJkIGZvciBjbGllbnRzIHRvIG1hbmFnZSB3b3JraW5nIGNvcGllcwoJICogd2l0aCB0aGlzIGRlc2lnbi5dCgkgKiA8L3A+CgkgKiAKCSAqIEByZXR1cm4gYSBuZXcgd29ya2luZyBjb3B5CgkgKi8KCXB1YmxpYyBJU2VydmVyV29ya2luZ0NvcHkgY3JlYXRlV29ya2luZ0NvcHkoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHNlcnZlciBjb25maWd1cmF0aW9uIGNhbiBiZSB1c2VkIHdpdGgKCSAqIHRoaXMgc2VydmVyLgoJICogPHA+CgkgKiBbaXNzdWU6IFRoaXMgc2VlbXMgdG8gYmUganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZC4gR2l2ZW4gdGhhdCBpdCdzIAoJICogc3RyYWlnaHRmb3J3YXJkIGVub3VnaHQgZm9yIGEgY2xpZW50IHRvIGNvbXBhcmUgCgkgKiB0aGlzLmdldFNlcnZlclR5cGUoKS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkKCSAqIHRvIGNvbmZpZ3VyYXRpb24uZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKSwKCSAqIGl0J3Mgbm90IGNsZWFyIHRoYXQgdGhlcmUgaXMgYSBncmVhdCBuZWVkIGZvciB0aGlzIG1ldGhvZC5dCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyBhIG51bGwgY29uZmlndXJhdGlvbi5dCgkgKiA8L3A+CgkgKiAKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzCgkgKiBhcHBsaWNhYmxlIHRvIChjYW4gYmUgdXNlZCB3aXRoKSB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24KCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMgdGhlIGdpdmVuIHNlcnZlcgoJICogY29uZmlndXJhdGlvbiwgYW5kIDxjb2RlPmZhbHNlL2NvZGU+IG90aGVyd2lzZQoJICovCglwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZENvbmZpZ3VyYXRpb24oSVBhdGggY29uZmlndXJhdGlvbik7CgoJLyoqCgkgKiBSZXR1cm5zIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHRoZSByZXF1ZXN0b3IgY2FuIHVzZQoJICogdGhyb3VnaG91dCBpdCdzIGxpZmVjeWNsZS4gVGhpcyBpcyBwcmltYXJ5IHRvIGJlIHVzZWQgYnkKCSAqIHNlcnZlcnMgZm9yIHdvcmtpbmcgZGlyZWN0b3JpZXMsIHNlcnZlciBzcGVjaWZpYwoJICogZmlsZXMsIGV0Yy4KCSAqCgkgKiA8cD5BcyBsb25nIGFzIHRoZSBzYW1lIGtleSBpcyB1c2VkIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24KCSAqIGVhY2ggdXNlIG9mIHRoZSB3b3JrYmVuY2gsIHRoaXMgbWV0aG9kIGRpcmVjdG9yeSB3aWxsIHJldHVybgoJICogdGhlIHNhbWUgZGlyZWN0b3J5LiBJZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZXF1ZXN0ZWQgb3ZlciBhCgkgKiBwZXJpb2Qgb2YgdGltZSwgdGhlIGRpcmVjdG9yeSBtYXkgYmUgZGVsZXRlZCBhbmQgYSBuZXcgb25lCgkgKiB3aWxsIGJlIGFzc2lnbmVkIG9uIHRoZSBuZXh0IHJlcXVlc3QuIEZvciB0aGlzIHJlYXNvbiwgYQoJICogc2VydmVyIHNob3VsZCByZXF1ZXN0IHRoZSB0ZW1wIGRpcmVjdG9yeSBvbiBzdGFydHVwCgkgKiBpZiBpdCB3YW50cyB0byBzdG9yZSBmaWxlcyB0aGVyZS4gSW4gYWxsIGNhc2VzLCB0aGUgc2VydmVyCgkgKiBzaG91bGQgaGF2ZSBhIGJhY2t1cCBwbGFuIHRvIHJlZmlsbCB0aGUgZGlyZWN0b3J5CgkgKiBpbiBjYXNlIGl0IGhhcyBiZWVuIGRlbGV0ZWQgc2luY2UgbGFzdCB1c2UuPC9wPgoJICoKCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoCgkgKi8KCXB1YmxpYyBJUGF0aCBnZXRUZW1wRGlyZWN0b3J5KCk7CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1vZHVsZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoCgkgKiB0aGlzIHNlcnZlci4KCSAqIDxwPgoJICogW2lzc3VlOiBDbGFyaWZ5IHRoYXQgdGhlc2UgYXJlIHJvb3QgbW9kdWxlcywgbm90IG9uZXMgcGFyZW50ZWQKCSAqIGJ5IHNvbWUgb3RoZXIgbW9kdWxlLl0KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwoJICovCglwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtb2R1bGUgbW9kaWZpY2F0aW9ucyBjb3VsZCBiZSBtYWRlIHRvIHRoaXMKCSAqIHNlcnZlciBhdCB0aGlzIHRpbWUuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIG1heSBkZWNpZGUgYmFzZWQgb24gdGhlIHR5cGUgb2YgbW9kdWxlCgkgKiBvciByZWZ1c2Ugc2ltcGx5IGR1ZSB0byByZWFjaGluZyBhIG1heGltdW0gbnVtYmVyIG9mCgkgKiBtb2R1bGVzIG9yIG90aGVyIGNyaXRlcmlhLgoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFRoaXMgc2VlbXMgb2RkIHRvIGhhdmUgYSBwcmUtZmxpZ2h0IG1ldGhvZC4KCSAqIEkgc2hvdWxkIGV4cGVjdCB0aGF0IHRoZSBjbGllbnQgY2FuIHByb3Bvc2UgbWFraW5nCgkgKiBhbnkgc2V0IG9mIG1vZHVsZSBjaGFuZ2VzIHRoZXkgZGVzaXJlICh2aWEgYSBzZXJ2ZXIKCSAqIHdvcmtpbmcgY29weSkuIElmIHRoZSBzZXJ2ZXIgZG9lc24ndCBsaWtlIGl0LCB0aGUgb3BlcmF0aW9uCgkgKiBzaG91bGQgZmFpbC5dCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIGFkZCBhIHBvc3NpYmx5LWVtcHR5IGxpc3Qgb2YgbW9kdWxlcyB0byBhZGQKCSAqIEBwYXJhbSByZW1vdmUgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gcmVtb3ZlCgkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCgkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb3Bvc2VkIG1vZGlmaWNhdGlvbnMKCSAqIGxvb2sgZmVhc2libGUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCgkgKi8KCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGNoaWxkIG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4gSWYgdGhpcwoJICogbW9kdWxlIGNvbnRhaW5zIG90aGVyIG1vZHVsZXMsIGl0IHNob3VsZCBsaXN0IHRob3NlCgkgKiBtb2R1bGVzLiBJZiBub3QsIGl0IHNob3VsZCByZXR1cm4gYW4gZW1wdHkgbGlzdC4KCSAqCgkgKiA8cD5UaGlzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gdGhlIGRpcmVjdCBjaGlsZHJlbi4KCSAqIFRvIG9idGFpbiB0aGUgZnVsbCBtb2R1bGUgdHJlZSwgdGhpcyBtZXRob2QgbWF5IGJlCgkgKiByZWN1cnNpdmVseSBjYWxsZWQgb24gdGhlIGNoaWxkcmVuLjwvcD4KCSAqCgkgKiBAcGFyYW0gbW9kdWxlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlCgkgKiBAcmV0dXJuIGFycmF5CgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgcGFyZW50IG1vZHVsZShzKSBvZiB0aGlzIG1vZHVsZS4gV2hlbgoJICogZGV0ZXJtaW5pbmcgaWYgYSBnaXZlbiBwcm9qZWN0IGNhbiBydW4gb24gYSBzZXJ2ZXIKCSAqIGNvbmZpZ3VyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZQoJICogYWN0dWFsIG1vZHVsZShzKSB0aGF0IG1heSBiZSBydW4gb24gdGhlIHNlcnZlci4gRm9yCgkgKiBpbnN0YW5jZSwgYSBXZWIgbW9kdWxlIG1heSByZXR1cm4gYSBsaXN0IG9mIEVhcgoJICogbW9kdWxlcyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBpbiBpZiB0aGUgc2VydmVyIG9ubHkKCSAqIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIEVhciBtb2R1bGVzLgoJICoKCSAqIDxwPklmIHRoZSBtb2R1bGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIG1ldGhvZAoJICogbWF5IHJldHVybiBudWxsLiBJZiB0aGUgdHlwZSBpcyBub3JtYWxseSBzdXBwb3J0ZWQgYnV0IHRoZXJlCgkgKiBpcyBhIGNvbmZpZ3VyYXRpb24gcHJvYmxlbSBvciBtaXNzaW5nIHBhcmVudCwgZXRjLiwgdGhpcwoJICogbWV0aG9kIG1heSBmaXJlIGEgQ29yZUV4Y2VwdGlvbiB0aGF0IG1heSB0aGVuIGJlIHByZXNlbnRlZAoJICogdG8gdGhlIHVzZXIuPC9wPgoJICoKCSAqIDxwPklmIGl0IGRvZXMgcmV0dXJuIHZhbGlkIHBhcmVudChzKSwgdGhpcyBtZXRob2Qgc2hvdWxkCgkgKiBhbHdheXMgcmV0dXJuIHRoZSB0b3Btb3N0IHBhcmVudCBtb2R1bGUocyksIGV2ZW4gaWYKCSAqIHRoZXJlIGFyZSBhIGZldyBsZXZlbHMgKGEgaGVpcmFyY2h5KSBvZiBtb2R1bGVzLjwvcD4KCSAqCgkgKiBAcGFyYW0gbW9kdWxlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlCgkgKiBAcmV0dXJuIGFycmF5CgkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0UGFyZW50TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCQoJLyoqCgkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIElTZXJ2ZXJQb3J0cyB0aGF0IHRoaXMgc2VydmVyIGhhcy4KCSAqCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBJU2VydmVyUG9ydFtdIGdldFNlcnZlclBvcnRzKCk7Cn0=