LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKCmltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CmltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmoyZWUuSVdlYk1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5XZWJNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdENvbmZpZ3VyYXRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLlRvbWNhdFNlcnZlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5BZGRXZWJNb2R1bGVDb21tYW5kOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLk1vZGlmeVdlYk1vZHVsZUNvbW1hbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuUmVtb3ZlV2ViTW9kdWxlQ29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLkNvbnRleHRJZHM7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Ub21jYXRVSVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5JQ29tbWFuZE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmVkaXRvci5TZXJ2ZXJFZGl0b3JQYXJ0OwovKioKICogVG9tY2F0IGNvbmZpZ3VyYXRpb24gd2ViIG1vZHVsZSBlZGl0b3IgcGFnZS4KICovCnB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCBleHRlbmRzIFNlcnZlckVkaXRvclBhcnQgewoJcHJvdGVjdGVkIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIyOwoJcHJvdGVjdGVkIFRvbWNhdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKCglwcm90ZWN0ZWQgVGFibGUgd2ViQXBwVGFibGU7Cglwcm90ZWN0ZWQgaW50IHNlbGVjdGlvbiA9IC0xOwoJcHJvdGVjdGVkIEJ1dHRvbiBhZGRQcm9qZWN0OwoJcHJvdGVjdGVkIEJ1dHRvbiBhZGRFeHRQcm9qZWN0OwoJcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmU7Cglwcm90ZWN0ZWQgQnV0dG9uIGVkaXQ7CgoJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7CgoJLyoqCgkgKiBDb25maWd1cmF0aW9uV2ViTW9kdWxlRWRpdG9yUGFydCBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbldlYk1vZHVsZUVkaXRvclBhcnQoKSB7CgkJc3VwZXIoKTsKCX0KCgkvKioKCSAqIAoJICovCglwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcigpIHsKCQlsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewoJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CgkJCQlpZiAoVG9tY2F0Q29uZmlndXJhdGlvbi5NT0RJRllfV0VCX01PRFVMRV9QUk9QRVJUWS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CgkJCQkJaW5pdGlhbGl6ZSgpOwoJCQkJfSBlbHNlIGlmIChUb21jYXRDb25maWd1cmF0aW9uLkFERF9XRUJfTU9EVUxFX1BST1BFUlRZLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKCQkJCQlpbml0aWFsaXplKCk7CgkJCQl9IGVsc2UgaWYgKFRvbWNhdENvbmZpZ3VyYXRpb24uUkVNT1ZFX1dFQl9NT0RVTEVfUFJPUEVSVFkuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewoJCQkJCWluaXRpYWxpemUoKTsKCQkJCX0KCQkJfQoJCX07CgkJY29uZmlndXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQoJcHJvdGVjdGVkIElDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpIHsKCQlyZXR1cm4gY29tbWFuZE1hbmFnZXI7Cgl9CgkKCS8qKgoJICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgoJICovCglwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CgkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwoKCQlTY3JvbGxlZEZvcm0gZm9ybSA9IHRvb2xraXQuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7CgkJZm9ybS5zZXRUZXh0KFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNQYWdlVGl0bGUiKSk7CgkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwoJCgkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUV8RXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRHxFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUnxTZWN0aW9uLkRFU0NSSVBUSU9OfEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwoJCXNlY3Rpb24uc2V0VGV4dChUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWNvbmZpZ3VyYXRpb25FZGl0b3JXZWJNb2R1bGVzU2VjdGlvbiIpKTsKCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvcldlYk1vZHVsZXNEZXNjcmlwdGlvbiIpKTsKCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKCgkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwoJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CgkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CgkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7CgkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7CgkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7CgkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwoJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgQ29udGV4dElkcy5DT05GSUdVUkFUSU9OX0VESVRPUl9XRUJNT0RVTEVTKTsKCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwoJCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7CgkJCgkJd2ViQXBwVGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKGNvbXBvc2l0ZSwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTik7CgkJd2ViQXBwVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKCQl3ZWJBcHBUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHdlYkFwcFRhYmxlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfTElTVCk7CgkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih3ZWJBcHBUYWJsZSk7CgkJCgkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKCQoJCVRhYmxlQ29sdW1uIGNvbCA9IG5ldyBUYWJsZUNvbHVtbih3ZWJBcHBUYWJsZSwgU1dULk5PTkUpOwoJCWNvbC5zZXRUZXh0KFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvclBhdGhDb2x1bW4iKSk7CgkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoOCwgODUsIHRydWUpOwoJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CgkKCQlUYWJsZUNvbHVtbiBjb2wyID0gbmV3IFRhYmxlQ29sdW1uKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7CgkJY29sMi5zZXRUZXh0KFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvckRvY0Jhc2VDb2x1bW4iKSk7CgkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEzLCAxMzUsIHRydWUpOwoJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CgkKCQlUYWJsZUNvbHVtbiBjb2wzID0gbmV3IFRhYmxlQ29sdW1uKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7CgkJY29sMy5zZXRUZXh0KFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvclByb2plY3RDb2x1bW4iKSk7CgkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDg1LCB0cnVlKTsKCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwoJCgkJVGFibGVDb2x1bW4gY29sNCA9IG5ldyBUYWJsZUNvbHVtbih3ZWJBcHBUYWJsZSwgU1dULk5PTkUpOwoJCWNvbDQuc2V0VGV4dChUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWNvbmZpZ3VyYXRpb25FZGl0b3JSZWxvYWRDb2x1bW4iKSk7CgkJY29sRGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDcsIDc1LCB0cnVlKTsKCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbERhdGEpOwoJCQoJCXdlYkFwcFRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7CgkKCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJZGF0YS53aWR0aEhpbnQgPSA0NTA7CgkJZGF0YS5oZWlnaHRIaW50ID0gMTIwOwoJCXdlYkFwcFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CgkJd2ViQXBwVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCXNlbGVjdFdlYkFwcCgpOwoJCQl9CgkJfSk7CgkKCQlDb21wb3NpdGUgcmlnaHRQYW5lbCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7CgkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwoJCXJpZ2h0UGFuZWwuc2V0TGF5b3V0KGxheW91dCk7CgkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwoJCXJpZ2h0UGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CgkJLy90b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihyaWdodFBhbmVsKTsKCQoJCS8vIGJ1dHRvbnMgc3RpbGwgdG8gYWRkOgoJCS8vIGFkZCBwcm9qZWN0LCBhZGQgZXh0ZXJuYWwgbW9kdWxlLCByZW1vdmUgbW9kdWxlCgkJYWRkUHJvamVjdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJpZ2h0UGFuZWwsIFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvckFkZFByb2plY3RNb2R1bGUiKSwgU1dULlBVU0gpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKCQlhZGRQcm9qZWN0LnNldExheW91dERhdGEoZGF0YSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGFkZFByb2plY3QsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfUFJPSkVDVCk7CgkKCQkvLyBkaXNhYmxlIHRoZSBhZGQgcHJvamVjdCBtb2R1bGUgYnV0dG9uIGlmIHRoZXJlIGFyZSBubwoJCS8vIHdlYiBwcm9qZWN0cyBpbiB0aGUgd29ya2JlbmNoCgkJaWYgKCFjYW5BZGRXZWJNb2R1bGUoKSkKCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKCQllbHNlIHsKCQkJYWRkUHJvamVjdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCQlXZWJNb2R1bGVEaWFsb2cgZGlhbG9nID0gbmV3IFdlYk1vZHVsZURpYWxvZyhnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0U2VydmVyKCksIHNlcnZlcjIsIGNvbmZpZ3VyYXRpb24sIHRydWUpOwoJCQkJCWRpYWxvZy5vcGVuKCk7CgkJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewoJCQkJCQlnZXRDb21tYW5kTWFuYWdlcigpLmV4ZWN1dGVDb21tYW5kKG5ldyBBZGRXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIGRpYWxvZy5nZXRXZWJNb2R1bGUoKSkpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJfQoJCgkJYWRkRXh0UHJvamVjdCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJpZ2h0UGFuZWwsIFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvckFkZEV4dGVybmFsTW9kdWxlIiksIFNXVC5QVVNIKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkJYWRkRXh0UHJvamVjdC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCWFkZEV4dFByb2plY3QuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCVdlYk1vZHVsZURpYWxvZyBkaWFsb2cgPSBuZXcgV2ViTW9kdWxlRGlhbG9nKGdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBnZXRTZXJ2ZXIoKSwgc2VydmVyMiwgY29uZmlndXJhdGlvbiwgZmFsc2UpOwoJCQkJZGlhbG9nLm9wZW4oKTsKCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKCQkJCQlnZXRDb21tYW5kTWFuYWdlcigpLmV4ZWN1dGVDb21tYW5kKG5ldyBBZGRXZWJNb2R1bGVDb21tYW5kKGNvbmZpZ3VyYXRpb24sIGRpYWxvZy5nZXRXZWJNb2R1bGUoKSkpOwoJCQkJfQoJCQl9CgkJfSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGFkZEV4dFByb2plY3QsIENvbnRleHRJZHMuQ09ORklHVVJBVElPTl9FRElUT1JfV0VCTU9EVUxFU19BRERfRVhURVJOQUwpOwoJCQoJCWVkaXQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVkaXRvckVkaXQiKSwgU1dULlBVU0gpOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKCQllZGl0LnNldExheW91dERhdGEoZGF0YSk7CgkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKCQllZGl0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CgkJCQlpZiAoc2VsZWN0aW9uIDwgMCkKCQkJCQlyZXR1cm47CgkJCQlXZWJNb2R1bGUgbW9kdWxlID0gKFdlYk1vZHVsZSkgY29uZmlndXJhdGlvbi5nZXRXZWJNb2R1bGVzKCkuZ2V0KHNlbGVjdGlvbik7CgkJCQlXZWJNb2R1bGVEaWFsb2cgZGlhbG9nID0gbmV3IFdlYk1vZHVsZURpYWxvZyhnZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZ2V0U2VydmVyKCksIHNlcnZlcjIsIGNvbmZpZ3VyYXRpb24sIG1vZHVsZSk7CgkJCQlkaWFsb2cub3BlbigpOwoJCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewoJCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkuZXhlY3V0ZUNvbW1hbmQobmV3IE1vZGlmeVdlYk1vZHVsZUNvbW1hbmQoY29uZmlndXJhdGlvbiwgc2VsZWN0aW9uLCBkaWFsb2cuZ2V0V2ViTW9kdWxlKCkpKTsKCQkJCX0KCQkJfQoJCX0pOwoJCVdvcmtiZW5jaEhlbHAuc2V0SGVscChlZGl0LCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfRURJVCk7CgkKCQlyZW1vdmUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihyaWdodFBhbmVsLCBUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVkaXRvclJlbW92ZSIpLCBTV1QuUFVTSCk7CgkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwoJCXJlbW92ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKCQlyZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCWlmIChzZWxlY3Rpb24gPCAwKQoJCQkJCXJldHVybjsKCQkJCWdldENvbW1hbmRNYW5hZ2VyKCkuZXhlY3V0ZUNvbW1hbmQobmV3IFJlbW92ZVdlYk1vZHVsZUNvbW1hbmQoY29uZmlndXJhdGlvbiwgc2VsZWN0aW9uKSk7CgkJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7CgkJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwoJCQkJc2VsZWN0aW9uID0gLTE7CgkJCX0KCQl9KTsKCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocmVtb3ZlLCBDb250ZXh0SWRzLkNPTkZJR1VSQVRJT05fRURJVE9SX1dFQk1PRFVMRVNfUkVNT1ZFKTsKCgkJaW5pdGlhbGl6ZSgpOwoJfQoKCXByb3RlY3RlZCBib29sZWFuIGNhbkFkZFdlYk1vZHVsZSgpIHsKCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSk7CgkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlc1tpXS5nZXRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MpOwoJCQkJaWYgKHdlYk1vZHVsZSAhPSBudWxsKSB7CgkJCQkJSVN0YXR1cyBzdGF0dXMgPSBzZXJ2ZXIuY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1tpXSB9LCBudWxsLCBudWxsKTsKCQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmlzT0soKSkKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CgkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkKCQkJY29uZmlndXJhdGlvbi5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQkKCS8qIChub24tSmF2YWRvYykKCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuCgkgKi8KCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CgkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7CgkJCgkJVG9tY2F0U2VydmVyIHRzID0gKFRvbWNhdFNlcnZlcikgc2VydmVyLmdldEFkYXB0ZXIoVG9tY2F0U2VydmVyLmNsYXNzKTsKCQljb25maWd1cmF0aW9uID0gdHMuZ2V0VG9tY2F0Q29uZmlndXJhdGlvbigpOwoJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCgkJCWFkZENoYW5nZUxpc3RlbmVyKCk7CgkJCgkJaWYgKHNlcnZlciAhPSBudWxsKQoJCQlzZXJ2ZXIyID0gKElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmdldEFkYXB0ZXIoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5LmNsYXNzKTsKCQkKCQlpbml0aWFsaXplKCk7Cgl9CgoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKCQlpZiAod2ViQXBwVGFibGUgPT0gbnVsbCkKCQkJcmV0dXJuOwoKCQl3ZWJBcHBUYWJsZS5yZW1vdmVBbGwoKTsKCQoJCUxpc3QgbGlzdCA9IGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpOwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJV2ViTW9kdWxlIG1vZHVsZSA9IChXZWJNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHdlYkFwcFRhYmxlLCBTV1QuTk9ORSk7CgkKCQkJLy8gRklYLU1FCgkJCVN0cmluZyBtZW1lbnRvID0gbW9kdWxlLmdldE1lbWVudG8oKTsKCQkJU3RyaW5nIHByb2plY3ROYW1lID0gIiI7CgkJCUltYWdlIHByb2plY3RJbWFnZSA9IG51bGw7CgkJCWlmIChtZW1lbnRvICE9IG51bGwgJiYgbWVtZW50by5sZW5ndGgoKSA+IDApIHsKCQkJCXByb2plY3ROYW1lID0gVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVjb25maWd1cmF0aW9uRWRpdG9yUHJvamVjdE1pc3NpbmciLCBuZXcgU3RyaW5nW10ge21lbWVudG99KTsKCQkJCXByb2plY3RJbWFnZSA9IFRvbWNhdFVJUGx1Z2luLmdldEltYWdlKFRvbWNhdFVJUGx1Z2luLklNR19QUk9KRUNUX01JU1NJTkcpOwoJCQkJSU1vZHVsZSBtb2R1bGUyID0gU2VydmVyVXRpbC5nZXRNb2R1bGUobWVtZW50byk7CgkJCQlpZiAobW9kdWxlICE9IG51bGwpIHsKCQkJCQlwcm9qZWN0TmFtZSA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChtb2R1bGUyKTsKCQkJCQlwcm9qZWN0SW1hZ2UgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG1vZHVsZTIpOwoJCQkJfQoJCQl9CgkKCQkJU3RyaW5nIHJlbG9hZCA9IG1vZHVsZS5pc1JlbG9hZGFibGUoKSA/IFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZEVuYWJsZWQiKSA6IFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlY29uZmlndXJhdGlvbkVkaXRvclJlbG9hZERpc2FibGVkIik7CgkJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW10ge21vZHVsZS5nZXRQYXRoKCksIG1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgcHJvamVjdE5hbWUsIHJlbG9hZH07CgkJCWl0ZW0uc2V0VGV4dChzKTsKCQkJaXRlbS5zZXRJbWFnZSgwLCBUb21jYXRVSVBsdWdpbi5nZXRJbWFnZShUb21jYXRVSVBsdWdpbi5JTUdfV0VCX01PRFVMRSkpOwoJCQlpZiAocHJvamVjdEltYWdlICE9IG51bGwpCgkJCQlpdGVtLnNldEltYWdlKDIsIHByb2plY3RJbWFnZSk7CgkJfQoJCQoJCWlmIChyZWFkT25seSkgewoJCQlhZGRQcm9qZWN0LnNldEVuYWJsZWQoZmFsc2UpOwoJCQlhZGRFeHRQcm9qZWN0LnNldEVuYWJsZWQoZmFsc2UpOwoJCQllZGl0LnNldEVuYWJsZWQoZmFsc2UpOwoJCQlyZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7CgkJfSBlbHNlIHsKCQkJYWRkUHJvamVjdC5zZXRFbmFibGVkKGNhbkFkZFdlYk1vZHVsZSgpKTsKCQkJYWRkRXh0UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwoJCX0KCX0KCgkvKioKCSAqIAoJICovCglwcm90ZWN0ZWQgdm9pZCBzZWxlY3RXZWJBcHAoKSB7CgkJaWYgKHJlYWRPbmx5KQoJCQlyZXR1cm47CgoJCXRyeSB7CgkJCXNlbGVjdGlvbiA9IHdlYkFwcFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7CgkJCXJlbW92ZS5zZXRFbmFibGVkKHRydWUpOwoJCQllZGl0LnNldEVuYWJsZWQodHJ1ZSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJc2VsZWN0aW9uID0gLTE7CgkJCXJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKCQkJZWRpdC5zZXRFbmFibGVkKGZhbHNlKTsKCQl9Cgl9CgkKCS8qKgoJICogQHNlZSBJV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCgkgKi8KCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewoJCWlmICh3ZWJBcHBUYWJsZSAhPSBudWxsKQoJCQl3ZWJBcHBUYWJsZS5zZXRGb2N1cygpOwoJfQp9