LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyOwovKioKICogQSBzZXJ2ZXIgZGVsZWdhdGUgcHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB2YXJpb3VzIAogKiBnZW5lcmljIGFuZCBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvcGVyYXRpb25zIGZvciBhIHNwZWNpZmljIHR5cGUgb2Ygc2VydmVyLgogKiBBIHNlcnZlciBkZWxlZ2F0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlCiAqIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgYSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uLgogKiA8cD4KICogV2hlbiB0aGUgc2VydmVyIGluc3RhbmNlIG5lZWRzIHRvIGJlIGdpdmVuIGEgZGVsZWdhdGUsIHRoZSBkZWxlZ2F0ZSBjbGFzcwogKiBzcGVjaWZpZWQgZm9yIHRoZSBzZXJ2ZXIgdHlwZSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIDAtYXJndW1lbnQgY29uc3RydWN0b3IKICogYW5kIHByaW1lZCB3aXRoIDxjb2RlPmRlbGVnYXRlLmluaXRpYWxpemUoKChJU2VydmVyU3RhdGUpc2VydmVyKTwvY29kZT4sIAogKiB3aGljaCBpdCBpcyBleHBlY3RlZCB0byBoYW5nIG9uIHRvLiBMYXRlciwgd2hlbgogKiA8Y29kZT5kZWxlZ2F0ZS5kaXNwb3NlKCk8L2NvZGU+IGlzIGNhbGxlZCBhcyB0aGUgc2VydmVyIGluc3RhbmNlIGlzCiAqIGJlaW5nIGRpc2NhcmRlZCwgdGhlIGRlbGVnYXRlIGlzIGV4cGVjdGVkIHRvIGxldCBnbyBvZiB0aGUgc2VydmVyIGluc3RhbmNlLgogKiA8L3A+CiAqIDxwPgogKiBTZXJ2ZXIgZGVsZWdhdGVzIG1heSBrZWVwIHN0YXRlIGluIGluc3RhbmNlIGZpZWxkcywgYnV0IHRoYXQgc3RhdGUgaXMKICogdHJhbnNpZW50IGFuZCB3aWxsIG5vdCBiZSBwZXJzaXN0ZWQgYWNyb3NzIHdvcmtiZW5jaCBzZXNzaW9ucy4KICogPC9wPgogKiA8cD4KICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSBleHRlbmRlZCBvbmx5IGJ5IGNsaWVudHMKICogdG8gZXh0ZW5kIHRoZSA8Y29kZT5zZXJ2ZXJUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgogKiA8L3A+CiAqIDxwPgogKiA8aXQ+Q2F2ZWF0OiBUaGUgc2VydmVyIGNvcmUgQVBJIGlzIHN0aWxsIGluIGFuIGVhcmx5IGZvcm0sIGFuZCBpcwogKiBsaWtlbHkgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHRoZSBpbml0aWFsIHJlbGVhc2UuPC9pdD4KICogPC9wPgogKiAKICogQHNlZSBJU2VydmVyCiAqIEBzZWUgSVNlcnZlcldvcmtpbmdDb3B5CiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSB7Cglwcml2YXRlIFNlcnZlciBzZXJ2ZXI7CgoJLyoqCgkgKiBEZWxlZ2F0ZXMgbXVzdCBoYXZlIGEgcHVibGljIDAtYXJnIGNvbnN0cnVjdG9yLgoJICovCglwdWJsaWMgU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUoKSB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogSW5pdGlhbGl6ZXMgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUgd2l0aCBpdHMgbGlmZS1sb25nIHNlcnZlciBpbnN0YW5jZS4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCgkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICogCgkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgaW5zdGFuY2UKCSAqLwoJcHVibGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZShTZXJ2ZXIgbmV3U2VydmVyKSB7CgkJc2VydmVyID0gbmV3U2VydmVyOwoJCWluaXRpYWxpemUoKTsKCX0KCgkvKioKCSAqIEluaXRpYWxpemVzIHRoaXMgc2VydmVyIGRlbGVnYXRlLiBUaGlzIG1ldGhvZCBnaXZlcyBkZWxlZ2F0ZXMgYSBjaGFuY2UKCSAqIHRvIGRvIHRoZWlyIG93biBpbml0aWFsaXphdGlvbi4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmsuCgkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICovCglwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNlcnZlciB0aGF0IHRoaXMgc2VydmVyIGRlbGVnYXRlIGNvcnJlc3BvbmRzIHRvLgoJICogCgkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIKCSAqLwoJcHVibGljIGZpbmFsIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewoJCXJldHVybiBzZXJ2ZXI7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgc2VydmVyLgoJICoKCSAqIEBwYXJhbSBzdGF0ZSBvbmUgb2YgdGhlIHNlcnZlciBzdGF0ZSAoPGNvZGU+U1RBVEVfWFhYPC9jb2RlPikKCSAqIGNvbnN0YW50cyBkZWNsYXJlZCBvbiB7QGxpbmsgSVNlcnZlcn0KCSAqIEBzZWUgSVNlcnZlciNnZXRTZXJ2ZXJTdGF0ZSgpCgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZlclN0YXRlKGludCBzdGF0ZSkgewoJCXNlcnZlci5zZXRTZXJ2ZXJTdGF0ZShzdGF0ZSk7Cgl9CgkKCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1vZGUoU3RyaW5nIG1vZGUpIHsKCQlzZXJ2ZXIuc2V0TW9kZShtb2RlKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHNlcnZlciByZXN0YXJ0IHN0YXRlLgoJICoKCSAqIEBwYXJhbSBzdGF0ZSBib29sZWFuCgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZlclJlc3RhcnRTdGF0ZShib29sZWFuIHN0YXRlKSB7CgkJc2VydmVyLnNldFNlcnZlclJlc3RhcnRTdGF0ZShzdGF0ZSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBzZXJ2ZXIgcHVibGlzaCBzdGF0ZS4KCSAqCgkgKiBAcGFyYW0gc3RhdGUgaW50CgkgKi8KCXB1YmxpYyBmaW5hbCB2b2lkIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShpbnQgc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0U2VydmVyUHVibGlzaFN0YXRlKHN0YXRlKTsKCX0KCgkvKioKCSAqIEhvb2sgdG8gZmlyZSBhbiBldmVudCB3aGVuIGEgbW9kdWxlIHN0YXRlIGNoYW5nZXMuCgkgKiAKCSAqIEBwYXJhbSBtb2R1bGUKCSAqIEBwYXJhbSBzdGF0ZQoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVTdGF0ZShJTW9kdWxlIG1vZHVsZSwgaW50IHN0YXRlKSB7CgkJc2VydmVyLnNldE1vZHVsZVN0YXRlKG1vZHVsZSwgc3RhdGUpOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgbW9kdWxlIHB1Ymxpc2ggc3RhdGUuCgkgKgoJICogQHBhcmFtIHN0YXRlIGludAoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVQdWJsaXNoU3RhdGUoSU1vZHVsZSBtb2R1bGUsIGludCBzdGF0ZSkgewoJCXNlcnZlci5zZXRNb2R1bGVQdWJsaXNoU3RhdGUobW9kdWxlLCBzdGF0ZSk7Cgl9CgkKCS8qKgoJICogU2V0cyB0aGUgbW9kdWxlIHJlc3RhcnQgc3RhdGUuCgkgKgoJICogQHBhcmFtIHN0YXRlIGludAoJICovCglwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2R1bGVSZXN0YXJ0U3RhdGUoSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gc3RhdGUpIHsKCQlzZXJ2ZXIuc2V0TW9kdWxlUmVzdGFydFN0YXRlKG1vZHVsZSwgc3RhdGUpOwoJfQoKCS8qKgoJICogRGlzcG9zZXMgb2YgdGhpcyBzZXJ2ZXIgZGVsZWdhdGUuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgd2ViIHNlcnZlciBjb3JlIGZyYW1ld29yay4KCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCgkgKiA8L3A+CgkgKiA8cD4KCSAqIEltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gbGV0IGdvIG9mIHRoZSBkZWxlZ2F0ZSdzIHJlZmVyZW5jZQoJICogdG8gdGhlIHNlcnZlciwgZGVyZWdpc3RlciBsaXN0ZW5lcnMsIGV0Yy4KCSAqIDwvcD4KCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KCSAqIHF1aWNrbHkuIElmIGFueSByZXB1Ymxpc2hpbmcgbXVzdCBvY2N1ciwgdGhlIHJlbGV2YW50IGluLXN5bmMKCSAqIG1ldGhvZHMgc2hvdWxkIHJldHVybiBhIG5ldyB2YWx1ZS4gSWYgdGhlIHNlcnZlciBtdXN0IGJlIHJlc3RhcnRlZCwKCSAqIHRoZSBpc1Jlc3RhcnROZWVkZWQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlLgoJICogCgkgKiBAc2VlIElTZXJ2ZXIjdXBkYXRlQ29uZmlndXJhdGlvbigpCgkgKi8KCS8vcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlQ29uZmlndXJhdGlvbigpOwoKCS8qKgoJICogQSBtb2R1bGUgcmVzb3VyY2UgaGFzIGNoYW5nZWQuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KCSAqIHF1aWNrbHkuIElmIHRoZSBzZXJ2ZXIgbXVzdCBiZSByZXN0YXJ0ZWQgdG8gaGFuZGxlIHRoZQoJICogY2hhbmdlIG9mIHRoaXMgZmlsZSwgdGhlIGlzUmVzdGFydE5lZWRlZCgpIG1ldGhvZCBzaG91bGQKCSAqIHJldHVybiB0cnVlIGFuZCB0aGUgZXZlbnQgc2hvdWxkIGJlIGZpcmVkLgoJICoKCSAqIEBwYXJhbSBtb2R1bGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUKCSAqIEBwYXJhbSBkZWx0YSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVJlc291cmNlRGVsdGEKCSAqLwoJLy9wdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVNb2R1bGUoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVSZXNvdXJjZURlbHRhIGRlbHRhKTsKCgkvKioKCSAqIE1ldGhvZHMgY2FsbGVkIHRvIG5vdGlmeSB0aGF0IHB1Ymxpc2hpbmcgaXMgYWJvdXQgdG8gYmVnaW4uCgkgKiBUaGlzIGFsbG93cyB0aGUgc2VydmVyIHRvIG9wZW4gYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKCSAqIG9yIGdldCBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIHJlYWR5LgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIHNlcnZlciBjb3JlIGZyYW1ld29yaywKCSAqIGluIHJlc3BvbnNlIHRvIGEgY2FsbCB0byA8Y29kZT5JU2VydmVyLnB1Ymxpc2goKTwvY29kZT4uCgkgKiBDbGllbnRzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgbWV0aG9kLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBtb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KCSAqLwoJcHVibGljIHZvaWQgcHVibGlzaFN0YXJ0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCS8vIGRvIG5vdGhpbmcKCX0KCgkvKioKCSAqIFB1Ymxpc2ggdGhlIHNlcnZlci4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCgkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgoJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIG1vbml0b3IKCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgoJICovCglwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwdWJsaXNoU2VydmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247CgoJLyoqCgkgKiBQdWJsaXNoIGFuIGluZGl2aWR1YWwgbW9kdWxlIHRvIHRoZSBzZXJ2ZXIuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgc2VydmVyIGNvcmUgZnJhbWV3b3JrLAoJICogaW4gcmVzcG9uc2UgdG8gYSBjYWxsIHRvIDxjb2RlPklTZXJ2ZXIucHVibGlzaCgpPC9jb2RlPi4KCSAqIENsaWVudHMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBtZXRob2QuCgkgKiA8L3A+CgkgKiAKCSAqIEBwYXJhbSBwYXJlbnRzCgkgKiBAcGFyYW0gbW9kdWxlCgkgKiBAcGFyYW0gbW9uaXRvcgoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHB1Ymxpc2hNb2R1bGUoSU1vZHVsZVtdIHBhcmVudHMsIElNb2R1bGUgbW9kdWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwoKCS8qKgoJICogTWV0aG9kcyBjYWxsZWQgdG8gbm90aWZ5IHRoYXQgcHVibGlzaGluZyBoYXMgZmluaXNoZWQuCgkgKiBUaGUgc2VydmVyIGNhbiBjbG9zZSBhbnkgb3BlbiBjb25uZWN0aW9ucyB0byB0aGUgc2VydmVyCgkgKiBhbmQgZG8gYW55IGNsZWFudXAgb3BlcmF0aW9ucy4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBmcmFtZXdvcmssCgkgKiBpbiByZXNwb25zZSB0byBhIGNhbGwgdG8gPGNvZGU+SVNlcnZlci5wdWJsaXNoKCk8L2NvZGU+LgoJICogQ2xpZW50cyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIG1ldGhvZC4KCSAqIDwvcD4KCSAqCgkgKiBAcGFyYW0gbW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCgkgKi8KCXB1YmxpYyB2b2lkIHB1Ymxpc2hGaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gZG8gbm90aGluZwoJfQoKCS8qKgoJICogCgkgKiBAc2VlIElTZXJ2ZXIjc2V0TGF1bmNoRGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKCSAqLwoJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0TGF1bmNoRGVmYXVsdHMoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSk7CgoJLyoqCgkgKiBSZXN0YXJ0IHRoaXMgc2VydmVyLiBUaGUgc2VydmVyIHNob3VsZCB1c2UgdGhlIHNlcnZlcgoJICogbGlzdGVuZXIgdG8gbm90aWZ5IHByb2dyZXNzLiBJdCBtdXN0IHVzZSB0aGUgc2FtZSBkZWJ1ZwoJICogZmxhZ3MgYXMgd2FzIG9yaWdpbmFsbHkgcGFzc2VkIGludG8gdGhlIHN0YXJ0KCkgbWV0aG9kLgoJICogCgkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGlmIHRoZXJlIGlzIGEgcXVpY2svYmV0dGVyIHdheSB0byByZXN0YXJ0CgkgKiB0aGUgc2VydmVyLiBJZiBpdCB0aHJvd3MgYSBDb3JlRXhjZXB0aW9uLCB0aGUgbm9ybWFsIHN0b3Avc3RhcnQKCSAqIGFjdGlvbnMgd2lsbCBiZSB1c2VkLgoJICovCglwdWJsaWMgdm9pZCByZXN0YXJ0KFN0cmluZyBsYXVuY2hNb2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG51bGwpOwoJfQoKCS8qKgoJICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlIHJlc3RhcnRlZC4KCSAqIDxwPgoJICogW2lzc3VlOiBJdCdzIHVuY2xlYXIgd2hldGhlciB0aGlzIG9wZXJhdGlvbnMgaXMgZ3VhcmFudGVlZCB0byBiZSBmYXN0CgkgKiBvciB3aGV0aGVyIGl0IGNvdWxkIGludm9sdmUgY29tbXVuaWNhdGlvbiB3aXRoIGFueSBhY3R1YWwKCSAqIHNlcnZlci4gSWYgaXQgaXMgbm90IGZhc3QsIHRoZSBtZXRob2Qgc2hvdWxkIHRha2UgYSBwcm9ncmVzcwoJICogbW9uaXRvci5dCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtb2R1bGUgY2FuIGJlCgkgKiByZXN0YXJ0ZWQsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlIAoJICovCglwdWJsaWMgYm9vbGVhbiBjYW5SZXN0YXJ0TW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogQ2hlY2sgaWYgdGhlIGdpdmVuIG1vZHVsZSBpcyBpbiBzeW5jIG9uIHRoZSBzZXJ2ZXIuIEl0IHNob3VsZAoJICogcmV0dXJuIHRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgcmVzdGFydGVkIChpcyBvdXQgb2YKCSAqIHN5bmMpIG9yIGZhbHNlIGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgbmVlZCB0byBiZSByZXN0YXJ0ZWQuCgkgKgoJICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZQoJICogQHJldHVybiBib29sZWFuCgkgKi8KCS8qcHVibGljIGJvb2xlYW4gaXNNb2R1bGVSZXN0YXJ0TmVlZGVkKElNb2R1bGUgbW9kdWxlKSB7CgkJcmV0dXJuIGZhbHNlOwoJfSovCgoJLyoqCgkgKiBBc3luY2hyb25vdXNseSByZXN0YXJ0cyB0aGUgZ2l2ZW4gbW9kdWxlIG9uIHRoZSBzZXJ2ZXIuCgkgKiBTZWUgdGhlIHNwZWNpZmljYXRpb24gb2YgCgkgKiB7QGxpbmsgSVNlcnZlciNzeW5jaHJvbm91c1Jlc3RhcnRNb2R1bGUoSU1vZHVsZSwgSVByb2dyZXNzTW9uaXRvcil9CgkgKiBmb3IgZnVydGhlciBkZXRhaWxzLiAKCSAqIDxwPgoJICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCB1cGRhdGUgdGhlIG1vZHVsZSBzeW5jIHN0YXRlIGFuZCBmaXJlCgkgKiBhbiBldmVudCBmb3IgdGhlIG1vZHVsZS4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBJdCBzaG91bGQgcHJvYmFibHkgYmUgc3BlYydkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBlcnJvciBpZiB0aGUKCSAqIGdpdmVuIG1vZHVsZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIuXQoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzY3luY2hyb25vdXMsIGlzIHRoZXJlCgkgKiBhbnkgbmVlZCBmb3IgdGhlIHByb2dyZXNzIG1vbml0b3I/XQoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFNpbmNlIHRoaXMgbWV0aG9kIGlzIGFzY3luY2hyb25vdXMsIGhvdyBjYW4KCSAqIGl0IHJldHVybiBhIG1lYW5pbmdmdWwgSVN0YXR1cz8gCgkgKiBBbmQgSVNlcnZlci5zeW5jaHJvbm91c01vZHVsZVJlc3RhcnQgdGhyb3dzIENvcmVFeGNlcHRpb24KCSAqIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuXQoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IElmIHRoZSBtb2R1bGUgd2FzIGp1c3QgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIKCSAqIGFuZCBoYWQgbmV2ZXIgYmVlbiBzdGFydGVkLCB3b3VsZCBpcyBiZSBvayB0byAic3RhcnQiCgkgKiB0aGUgbW9kdWxlIHVzaW5nIHRoaXMgbWV0aG9kP10KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIG1vZHVsZSB0aGUgbW9kdWxlIHRvIGJlIHN0YXJ0ZWQKCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKCSAqICAgIHJlcG9ydGluZyBhbmQgY2FuY2VsbGF0aW9uIGFyZSBub3QgZGVzaXJlZAoJICogQHJldHVybiBzdGF0dXMgb2JqZWN0CgkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byByZXN0YXJ0IHRoZSBtb2R1bGUKCSAqLwoJcHVibGljIHZvaWQgcmVzdGFydE1vZHVsZShJTW9kdWxlIG1vZHVsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJLy8gZG8gbm90aGluZwoJfQoJCgkvKioKCSAqIFNodXRzIGRvd24gYW5kIHN0b3BzIHRoaXMgc2VydmVyLiBUaGUgc2VydmVyIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZAoJICogcXVpY2tseSBhbmQgdXNlIHRoZSBzZXJ2ZXIgbGlzdGVuZXIgdG8gbm90aWZ5IHNodXRkb3duIHByb2dyZXNzLgoJICogPHA+IAoJICogSWYgZm9yY2UgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpdCB3aWxsIGF0dGVtcHQgdG8gc3RvcCB0aGUgc2VydmVyCgkgKiBub3JtYWxseS9ncmFjZWZ1bGx5LiBJZiBmb3JjZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgc2VydmVyCgkgKiBwcm9jZXNzIHdpbGwgYmUgdGVybWluYXRlZCBhbnkgd2F5IHRoYXQgaXQgY2FuLgoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFRoZXJlIGlzIG5vIHdheSB0byBjb21tdW5pY2F0ZSBmYWlsdXJlIHRvIHRoZQoJICogY2xpZW50LiBHaXZlbiB0aGF0IHRoaXMgb3BlcmF0aW9uIGNhbiBnbyBhd3J5LCB0aGVyZSBwcm9iYWJseQoJICogc2hvdWxkIGJlIGEgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIGZhaWxpbmcgYXN5bmNoIG9wZXJhdGlvbnMKCSAqIHRvIGJlIGRpYWdub3NlZC5dCgkgKiA8L3A+CgkgKiBAcGFyYW0gZm9yY2UgPGNvZGU+dHJ1ZTwvY29kZT4gdG8ga2lsbCB0aGUgc2VydmVyLCBvciA8Y29kZT5mYWxzZTwvY29kZT4KCSAqICAgIHRvIHN0b3Agbm9ybWFsbHkKCSAqLwoJcHVibGljIGFic3RyYWN0IHZvaWQgc3RvcChib29sZWFuIGZvcmNlKTsKfQ==