LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLyoqCiAqIAogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZXh0ZW5kcyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewoJcHJvdGVjdGVkIHN0YXRpYyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCQoJcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKCglwcm90ZWN0ZWQgTGlzdCBhZGRlZDsKCXByb3RlY3RlZCBMaXN0IHJlbW92ZWQ7CgoJLy8gbWFwIGZyb20gSVByb2plY3QgdG8gSU1vZHVsZVtdCglwcm90ZWN0ZWQgZmluYWwgTWFwIHByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KCSAqLwoJcHVibGljIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7CgkJc3VwZXIoKTsKCQkKCQlmYWN0b3JpZXMuYWRkKHRoaXMpOwoJCQoJCWFkZExpc3RlbmVyKCk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcygpIHsKCQljYWNoZU1vZHVsZXModHJ1ZSk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcyhib29sZWFuIGZvcmNlVXBkYXRlKSB7IAoJCXRyeSB7CgkJCUlQcm9qZWN0W10gcHJvamVjdHMyID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7CgkJCWludCBzaXplID0gcHJvamVjdHMyLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCS8vVHJhY2UudHJhY2UoImNhY2hpbmc6ICIgKyB0aGlzICsgIiAiICsgcHJvamVjdHNbaV0gKyAiICIgKyBpc1ZhbGlkTW9kdWxlKHByb2plY3RzW2ldKSk7CgkJCQlpZighcHJvamVjdHMyW2ldLmlzQWNjZXNzaWJsZSgpKQoJCQkJCXJlbW92ZU1vZHVsZXMocHJvamVjdHMyW2ldKTsKCQkJCWVsc2UgaWYgKGlzVmFsaWRNb2R1bGUocHJvamVjdHMyW2ldKSAmJiAoZm9yY2VVcGRhdGUgfHwgbmVlZHNVcGRhdGluZyhwcm9qZWN0czJbaV0pKSApIHsKCQkJCQlhZGRNb2R1bGVzKHByb2plY3RzMltpXSk7CgkJCQl9IAoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FjaGluZyBtb2R1bGVzIiwgZSk7CgkJfSBmaW5hbGx5IHsKCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwoJCX0KCX0KCglwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1VwZGF0aW5nKElQcm9qZWN0IHByb2plY3QpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkgKiBSZXR1cm4gdGhlIHdvcmtzcGFjZSByb290LgoJICogCgkgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAoJICovCglwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewoJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbW9kdWxlcyBmb3IgdGhlIGdpdmVuIHByb2plY3QsIG9yIG51bGwKCSAqIGlmIHRoaXMgZmFjdG9yeSBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZXMuCgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJdHJ5IHsKCQkJcmV0dXJuIChJTW9kdWxlW10pIHByb2plY3RzLmdldChwcm9qZWN0KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBBZGQgYSByZXNvdXJjZSBsaXN0ZW5lciB0byB0aGUgd29ya3NwYWNlLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7CgkJaWYgKGxpc3RlbmVyICE9IG51bGwpCgkJCXJldHVybjsKCgkJbGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgbGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2U6ICIgKyBldmVudC5nZXRUeXBlKCkgKyAiIC0+LSIpOwoJCQkJdHJ5IHsKCQkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CgkJCQkJCgkJCQkJLy9pZiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTIHx8IGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQoJCQkJCS8vCXJldHVybjsKCQkJCQoJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdG9yRGVsdGEpIHsKCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHZpc2l0b3JEZWx0YS5nZXRSZXNvdXJjZSgpOwoJCQkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJyZXNvdXJjZTogIiArIHJlc291cmNlKTsKCQoJCQkJCQkJLy8gb25seSByZXNwb25kIGNoYW5nZXMgd2l0aGluIHByb2plY3RzCgkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CgkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7CgkJCQkJCQkJaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShwcm9qZWN0LCB2aXNpdG9yRGVsdGEpOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFByb2plY3QoKSAhPSBudWxsKSB7CgkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwoJCQkJfQoJCQkJZmlyZUdsb2JhbEV2ZW50cygpOwoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSAtPC0iKTsKCQkJfQoJCX07CgkJCgkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKCX0KCQoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQkvLyBoYW5kbGUgcHJvamVjdCBsZXZlbCBjaGFuZ2VzCgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCS8vVHJhY2UudHJhY2UoIkZpcmluZyB0bzogIiArIGZhY3RvcnkpOwoJCQlmYWN0b3J5LmhhbmRsZVByb2plY3RDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCQkKCQkvLyBoYW5kbGUgaW50ZXJuYWwgdXBkYXRlcwoJCWl0ZXJhdG9yID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGZhY3RvcnkgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkvL1RyYWNlLnRyYWNlKCJGaXJpbmcgdG86ICIgKyBmYWN0b3J5KTsKCQkJZmFjdG9yeS5oYW5kbGVQcm9qZWN0SW50ZXJuYWxDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCX0KCQoJLyoqCgkgKiBGaXJlIHRoZSBhY2N1bXVsYXRlZCBtb2R1bGUgZmFjdG9yeSBldmVudHMuCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaXJlR2xvYmFsRXZlbnRzKCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkZpcmluZyBnbG9iYWwgbW9kdWxlIGV2ZW50Iik7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCWZhY3RvcnkudXBkYXRlUHJvamVjdHMoKTsKCQl9Cgl9CgoJLyoqCgkgKiBUZW1wb3JhcnkgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHByb2plY3QgbW9kdWxlcyBhcmUgdXBkYXRlZC4KCSAqLwoJcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2plY3RzKCkgewoJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGdldE1vZHVsZXMoKTsKCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCWlmIChtb2R1bGVzMltpXSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpCgkJCQkJKChQcm9qZWN0TW9kdWxlKSBtb2R1bGVzMltpXSkudXBkYXRlKCk7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQlpZighaW5pdGlhbGl6ZWQpCgkJCWNhY2hlTW9kdWxlcyhmYWxzZSk7CgkJaWYgKHByb2plY3RzLmNvbnRhaW5zS2V5KHByb2plY3QpKSB7CgkJCS8vIGFscmVhZHkgYSBtb2R1bGUKCQkJaWYgKCgoZGVsdGEuZ2V0S2luZCgpICYgIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpICE9IDApIHx8ICFpc1ZhbGlkTW9kdWxlKHByb2plY3QpKSB7CgkJCQlyZW1vdmVNb2R1bGVzKHByb2plY3QpOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gbm90IGEgbW9kdWxlCgkJCWlmIChpc1ZhbGlkTW9kdWxlKHByb2plY3QpKSB7CgkJCQlhZGRNb2R1bGVzKHByb2plY3QpOwoJCQl9CgkJfQoJfQoJCgkvKioKCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQoJICovCglwcml2YXRlIHZvaWQgaGFuZGxlUHJvamVjdEludGVybmFsQ2hhbmdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJZmluYWwgSVBhdGhbXSBwYXRocyA9IGdldExpc3RlbmVyUGF0aHMoKTsKCQlpZiAocGF0aHMgIT0gbnVsbCkgewoJCQlmaW5hbCBJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMocHJvamVjdCk7CgkJCWlmIChtb2R1bGVzICE9IG51bGwpIHsKCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewoJCQkJCWZpbmFsIElNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1tpXTsKCQkJCQlpZiAobW9kdWxlICE9IG51bGwgJiYgbW9kdWxlIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZSkgewoJCQkJCQkvLyBjaGVjayBmb3IgbGlzdGVuZXIgcGF0aHMKCQkJCQkJZmluYWwgaW50IHNpemUgPSBwYXRocy5sZW5ndGg7CgkJCQkJCWNsYXNzIFRlbXAgewoJCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCQkJCQl9CgkJCQkJCWZpbmFsIFRlbXAgdGVtcCA9IG5ldyBUZW1wKCk7CgkJCQkJCXRyeSB7CgkJCQkJCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdG9yRGVsdGEpIHsKCQkJCQkJCQkJaWYgKHRlbXAuZm91bmQpCgkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQkJCUlQYXRoIHBhdGggPSB2aXNpdG9yRGVsdGEuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwoJCQkJCQkJCQkKCQkJCQkJCQkJYm9vbGVhbiBwcmVmaXggPSBmYWxzZTsKCQkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplICYmICF0ZW1wLmZvdW5kOyBqKyspIHsKCQkJCQkJCQkJCWlmIChwYXRoc1tqXS5lcXVhbHMocGF0aCkpCgkJCQkJCQkJCQkJdGVtcC5mb3VuZCA9IHRydWU7CgkJCQkJCQkJCQllbHNlIGlmIChwYXRoLmlzUHJlZml4T2YocGF0aHNbal0pKQoJCQkJCQkJCQkJCXByZWZpeCA9IHRydWU7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYgKHRlbXAuZm91bmQpIHsKCQkJCQkJCQkJCSgoUHJvamVjdE1vZHVsZSkgbW9kdWxlKS51cGRhdGUoKTsKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJfSBlbHNlIGlmIChwcmVmaXgpCgkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCX0KCQkJCQkJCX0pOwoJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2VhcmNoaW5nIGZvciBsaXN0ZW5pbmcgcGF0aHMiLCBlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCgkvKioKCSAqIEFkZCBhIG1vZHVsZSBmb3IgdGhlIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICovCglwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpIHsKCQkKCQlJTW9kdWxlW10gbW9kdWxlcyA9IGNyZWF0ZU1vZHVsZXMocHJvamVjdCk7CgkJaWYgKG1vZHVsZXMgPT0gbnVsbCB8fCBtb2R1bGVzLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkJcHJvamVjdHMucHV0KHByb2plY3QsIG1vZHVsZXMpOwoJCWFkZGVkID0gbmV3IEFycmF5TGlzdCgyKTsKCQlhZGRlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb2R1bGVzKSk7Cgl9CgoJLyoqCgkgKiBSZW1vdmUgdGhlIG1vZHVsZXMgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqLwoJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJCgkJdHJ5IHsKCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSAoSU1vZHVsZVtdKSBwcm9qZWN0cy5nZXQocHJvamVjdCk7CgkJCQoJCQlwcm9qZWN0cy5yZW1vdmUocHJvamVjdCk7CgkJCWlmIChyZW1vdmVkID09IG51bGwpCgkJCQlyZW1vdmVkID0gbmV3IEFycmF5TGlzdCgyKTsKCQkJaWYobW9kdWxlcyA9PSBudWxsKQoJCQkJcmV0dXJuOwoJCQlyZW1vdmVkLmFkZEFsbChBcnJheXMuYXNMaXN0KG1vZHVsZXMpKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZW1vdmluZyBtb2R1bGUgcHJvamVjdCIsIGUpOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvamVjdCBtYXkgY29udGFpbiBtb2R1bGVzIG9mIHRoZSBjb3JyZWN0IHR5cGUuCgkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIG9ubHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IG1heSBjb250YWluIG1vZHVsZXMsIGFuZAoJICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGRlZmluaXRlbHkgZG9lcyBub3QKCSAqLwoJcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNWYWxpZE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KTsKCgkvKioKCSAqIENyZWF0ZXMgdGhlIG1vZHVsZXMgZm9yIGEgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0IHRvIGNyZWF0ZSBtb2R1bGVzIGZvcgoJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIG1vZHVsZXMKCSAqLwoJcHJvdGVjdGVkIGFic3RyYWN0IElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCB0aGUgbW9kdWxlIHNob3VsZCBsaXN0ZW4gdG8KCSAqIGZvciBzdGF0ZSBjaGFuZ2VzLiBUaGUgcGF0aHMgc2hvdWxkIGJlIHByb2plY3QgcmVsYXRpdmUgcGF0aHMuCgkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIHRoZSBwYXRocy4KCSAqCgkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgcGF0aHMKCSAqLwoJcHJvdGVjdGVkIElQYXRoW10gZ2V0TGlzdGVuZXJQYXRocygpIHsKCQlyZXR1cm4gbnVsbDsKCX0KfQ==