LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgogKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAyMDA2MDEwNiAgIDEyMTE5OSBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBN+GxsZXIKICogMjAwNjAzMjkgICAxMjcwMTYgYW5keXpoYWlAY2EuaWJtLmNvbSAtIEFuZHkgWmhhaQogKiAyMDA2MDUxNSAgIDExNTIyNSBzZW5ncGxAY2EuaWJtLmNvbSAtIFNlbmcgUGh1bmctTHUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kOwoKCmltcG9ydCBqYXZhLmlvLkZpbGU7CmltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmltcG9ydCBvcmcuYXBhY2hlLmF4aXMudG9vbHMuYW50LndzZGwuSmF2YTJXc2RsQW50VGFzazsKaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQud3NkbC5OYW1lc3BhY2VNYXBwaW5nOwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CmltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwppbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5BeGlzQ29uc3VtcHRpb25Db3JlTWVzc2FnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29udGV4dC5BeGlzRW1pdHRlckNvbnRleHQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnRleHQuQXhpc0VtaXR0ZXJEZWZhdWx0czsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUucGx1Z2luLldlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25Db3JlUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklMb2c7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKCi8qKgogKiBDb21tYW5kcyBhcmUgZXhlY3V0YWJsZSwgdW5kb2FibGUsIHJlZG9hYmxlIG9iamVjdHMuCiAqIEV2ZXJ5IENvbW1hbmQgaGFzIGEgbmFtZSBhbmQgYSBkZXNjcmlwdGlvbi4KICovCgpwdWJsaWMgY2xhc3MgSmF2YTJXU0RMQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uCnsKCglwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwoJcHJpdmF0ZSBGaWxlIHRlbXBPdXRwdXRXc2RsRmlsZTsKCXByaXZhdGUgZmluYWwgU3RyaW5nIFRFTVAgPSAidGVtcCI7IC8vJE5PTi1OTFMtMSQKCXByaXZhdGUgZmluYWwgU3RyaW5nIFdTRExfRVhUID0gIi53c2RsIjsgLy8kTk9OLU5MUy0xJAoKCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKCkgewoJfQkKCS8qKgoJICogQ29uc3RydWN0b3IgZm9yIEphdmEyV1NETENvbW1hbmQuCgkgKi8KCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKCQlzdXBlcigpOwoJCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwoJfQoKCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBhZGFwdGFibGUgKSAKCXsKCQlJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudCgpOwoJCUlTdGF0dXMgc3RhdHVzOwoJCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7CgkJCXN0YXR1cyA9IFN0YXR1c1V0aWxzLmVycm9yU3RhdHVzKEF4aXNDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5NU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQpOwoJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKCQkJcmV0dXJuIHN0YXR1czsKCQl9CgoJCWlmIChqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpID09IG51bGwpIHsKCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoQXhpc0NvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCk7CgkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwoJCQlyZXR1cm4gc3RhdHVzOwoJCX0KCgkJUHJvZ3Jlc3NVdGlscy5yZXBvcnQobW9uaXRvciwgTkxTLmJpbmQoQXhpc0NvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLk1TR19HRU5FUkFURV9XU0RMLCBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpICkpOwoKCQlyZXR1cm4gZXhlY3V0ZUFudFRhc2soZW52aXJvbm1lbnQsIG1vbml0b3IpOwoJfQoKCXByb3RlY3RlZCBJU3RhdHVzIGV4ZWN1dGVBbnRUYXNrKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgoJCWZpbmFsIGNsYXNzIEVtaXR0ZXIgZXh0ZW5kcyBKYXZhMldzZGxBbnRUYXNrIHsKCQkJcHVibGljIEVtaXR0ZXIoKSB7CgkJCQlzdXBlci5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwoJCQkJc3VwZXIuZ2V0UHJvamVjdCgpLmluaXQoKTsKCQkJCXN1cGVyLnNldFRhc2tUeXBlKCJheGlzIik7IC8vJE5PTi1OTFMtMSQKCQkJCXN1cGVyLnNldFRhc2tOYW1lKCJheGlzLWphdmEyd3NkbCIpOyAvLyROT04tTkxTLTEkCgkJCQlzdXBlci5zZXRPd25pbmdUYXJnZXQobmV3IFRhcmdldCgpKTsKCQkJfQoJCX0KCgkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwoJCUlMb2cgZW52TG9nID0gZW52aXJvbm1lbnQuZ2V0TG9nKCk7CgkJRW1pdHRlciBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoKTsKCQllbWl0dGVyLmNyZWF0ZUNsYXNzcGF0aCgpLnNldFBhdGgoamF2YVdTRExQYXJhbV8uZ2V0Q2xhc3NwYXRoKCkpOwoJCWVudkxvZy5sb2coSUxvZy5JTkZPLCA1MDA4LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiQ2xhc3MgUGF0aCA9ICIrIGphdmFXU0RMUGFyYW1fLmdldENsYXNzcGF0aCgpKTsKCQkKCQllbWl0dGVyLnNldFBvcnRUeXBlTmFtZShqYXZhV1NETFBhcmFtXy5nZXRQb3J0VHlwZU5hbWUoKSk7CgkJZW52TG9nLmxvZyhJTG9nLklORk8sIDUwMDksIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJQb3J0IFR5cGUgTmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldFBvcnRUeXBlTmFtZSgpKTsKCQkKCQllbWl0dGVyLnNldFNlcnZpY2VFbGVtZW50TmFtZShqYXZhV1NETFBhcmFtXy5nZXRTZXJ2aWNlTmFtZSgpKTsKCQllbnZMb2cubG9nKElMb2cuSU5GTywgNTAxMCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlNlcnZpY2UgTmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCkpOwoJCQoJCWVtaXR0ZXIuc2V0TG9jYXRpb24oamF2YVdTRExQYXJhbV8uZ2V0VXJsTG9jYXRpb24oKSk7CgkJZW52TG9nLmxvZyhJTG9nLklORk8sIDUwMTEsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJVUkwgTG9jYXRpb24gPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRVcmxMb2NhdGlvbigpKTsKCQkKCQllbWl0dGVyLnNldE1ldGhvZHMoamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwoJCWVudkxvZy5sb2coSUxvZy5JTkZPLCA1MDEyLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiTWV0aG9kcyA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE1ldGhvZFN0cmluZygpKTsKCQkKCQllbWl0dGVyLnNldFN0eWxlKGphdmFXU0RMUGFyYW1fLmdldFN0eWxlKCkpOwoJCWVudkxvZy5sb2coSUxvZy5JTkZPLCA1MDEzLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiU3R5bGUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKCQkKCQllbWl0dGVyLnNldFVzZShqYXZhV1NETFBhcmFtXy5nZXRVc2UoKSk7CgkJZW52TG9nLmxvZyhJTG9nLklORk8sIDUwMTQsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJVc2UgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRVc2UoKSk7CgkJCQkKCQkvLyBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgYXMgb3V0cHV0IGRpcmVjdG9yeSBmb3IgamF2YTJ3c2RsCgkJSVBhdGggcGx1Z2luU3RhdGVMb2MgPSBXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKTsKCQlGaWxlIHRlbXBEaXIgPSBuZXcgRmlsZShwbHVnaW5TdGF0ZUxvYy50b1N0cmluZygpKTsKCQlGaWxlIG5ld1RlbXBGaWxlID0gbnVsbDsKCQl0cnkgewoJCQluZXdUZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoVEVNUCwgV1NETF9FWFQsIHRlbXBEaXIpOwoJCQl0ZW1wT3V0cHV0V3NkbEZpbGUgPSBuZXdUZW1wRmlsZTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQl0ZW1wT3V0cHV0V3NkbEZpbGUgPSBuZXcgRmlsZSAocGx1Z2luU3RhdGVMb2MuYXBwZW5kKFRFTVArV1NETF9FWFQpLnRvU3RyaW5nKCkpOwoJCX0KCgkJZW1pdHRlci5zZXRPdXRwdXQodGVtcE91dHB1dFdzZGxGaWxlKTsKCQkKCQllbnZMb2cubG9nKElMb2cuSU5GTywgNTAxNSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIldTREwgTG9jYXRpb24gPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKSk7CgkJCgkJZW1pdHRlci5zZXROYW1lc3BhY2UoamF2YVdTRExQYXJhbV8uZ2V0TmFtZXNwYWNlKCkpOwoJCWVudkxvZy5sb2coSUxvZy5JTkZPLCA1MDE2LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiTmFtZSBTcGFjZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKCQkKCQllbWl0dGVyLnNldENsYXNzTmFtZShqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKCQllbnZMb2cubG9nKElMb2cuSU5GTywgNTAxNywgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIkJlYW4gbmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwoJCQoJCWVtaXR0ZXIuc2V0SW1wbENsYXNzKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwoJCQoJICAgIEF4aXNFbWl0dGVyQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUF4aXNDb25zdW1wdGlvbkNvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRBeGlzRW1pdHRlckNvbnRleHQoKTsKCSAgICAKCSAgICBpZiAoY29udGV4dC5pc1VzZUluaGVyaXRlZE1ldGhvZHNFbmFibGVkKCkgIT0gQXhpc0VtaXR0ZXJEZWZhdWx0cy5nZXRVc2VJbmhlcml0ZWRNZXRob2RzRGVmYXVsdCgpKQoJICAgIHsKCSAgICAJZW1pdHRlci5zZXRVc2VJbmhlcml0ZWRNZXRob2RzKGNvbnRleHQuaXNVc2VJbmhlcml0ZWRNZXRob2RzRW5hYmxlZCgpKTsKCQkJZW52TG9nLmxvZyhJTG9nLklORk8sIDUwOTksIHRoaXMsICJleGVjdXRlQW50VGFzayIsICIgc2V0IFVzZUluaGVyaXRlZE1ldGhvZHMgOiAiICsgY29udGV4dC5pc1VzZUluaGVyaXRlZE1ldGhvZHNFbmFibGVkKCkgKTsKCSAgICB9CgkJCgkJSGFzaE1hcCBtYXBwaW5ncyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7CgkJaWYobWFwcGluZ3MgIT0gbnVsbCl7CgkJCUl0ZXJhdG9yIGtleXMgPSBtYXBwaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOwoJCQl3aGlsZShrZXlzLmhhc05leHQoKSl7CgkJCQlTdHJpbmcgcGFrYWdlID0gKFN0cmluZylrZXlzLm5leHQoKTsKCQkJCVN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW1hcHBpbmdzLmdldChwYWthZ2UpOwoJCQkJTmFtZXNwYWNlTWFwcGluZyBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwcGluZygpOwoJCQkJbWFwLnNldFBhY2thZ2UocGFrYWdlKTsKCQkJCW1hcC5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKCQkJCWVtaXR0ZXIuYWRkTWFwcGluZyhtYXApOwkJCgkJCX0KCQl9CgkJCgkKCQl0cnkgewoJCQllbWl0dGVyLmV4ZWN1dGUoKTsKCQkJc3RhdHVzID0gbW92ZUdlbmVyYXRlZFdTREwoZW52aXJvbm1lbnQsIG1vbml0b3IpOwoJCX0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKCQkJZW52TG9nLmxvZyhJTG9nLkVSUk9SLCA1MDE4LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCBlKTsKCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoCgkJCUF4aXNDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5NU0dfRVJST1JfSkFWQV9XU0RMX0dFTkVSQVRFICsgIiAiIC8vJE5PTi1OTFMtMSQKCQkJK2UuZ2V0Q2F1c2UoKS50b1N0cmluZygpLCBlLmdldENhdXNlKCkpOwoJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKCQkJcmV0dXJuIHN0YXR1czsKCX0gZmluYWxseSB7CgkJaWYgKHRlbXBPdXRwdXRXc2RsRmlsZS5leGlzdHMoKSkgewoJCQl0ZW1wT3V0cHV0V3NkbEZpbGUuZGVsZXRlKCk7CgkJfQoJfQoJCXJldHVybiBzdGF0dXM7CgoJfQoJCglwdWJsaWMgSVN0YXR1cyBtb3ZlR2VuZXJhdGVkV1NETChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsCgkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKCQlGaWxlSW5wdXRTdHJlYW0gZmluU3RyZWFtID0gbnVsbDsKCQkKCQlSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKCQlJU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpOwoJCQoJCVN0cmluZyBvdXRwdXRXc2RsTG9jYXRpb24gPSBqYXZhV1NETFBhcmFtXy5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKTsKCQlJUGF0aCB0YXJnZXRQYXRoID0gbmV3IFBhdGgob3V0cHV0V3NkbExvY2F0aW9uKTsKCQl0cnkgewoJCQlmaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBPdXRwdXRXc2RsRmlsZSk7CgkJCWlmIChmaW5TdHJlYW0gIT0gbnVsbCkgewoJCQkJRmlsZVJlc291cmNlVXRpbHMuY3JlYXRlRmlsZUF0TG9jYXRpb24oY29udGV4dCwgdGFyZ2V0UGF0aC5tYWtlQWJzb2x1dGUoKSwgZmluU3RyZWFtLAoJCQkJCQltb25pdG9yLCBzdGF0dXNIYW5kbGVyKTsKCQkJCWZpblN0cmVhbS5jbG9zZSgpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQXhpc0NvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLk1TR19FUlJPUl9NT1ZFX1JFU09VUkNFLG5ldyBTdHJpbmdbXXtlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBlKTsKCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7CgkJfSBmaW5hbGx5IHsKCQkJdHJ5IHsKCQkJCWlmIChmaW5TdHJlYW0gIT0gbnVsbCkgewoJCQkJCWZpblN0cmVhbS5jbG9zZSgpOwoJCQkJfQoJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJCX0KCQl9CgkJcmV0dXJuIHN0YXR1czsKCX0KCQoJcHVibGljIFN0YXR1cyB1bmRvKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBTdGF0dXMgcmVkbyhJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCgkgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCgkgKi8KCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewoJCXJldHVybiBqYXZhV1NETFBhcmFtXzsKCX0KCglwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFybSkgewoJCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcm07Cgl9CgkKCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCgl7CgkgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEphdmFXU0RMUGFyYW0oKS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKSk7IAoJICAgIFN0cmluZyB1cmwgPSAiIjsKCQkgIHRyeSB7CgkgICAgCXVybCA9IGZpbGUudG9VUkwoKS50b1N0cmluZygpOwoJICAgIH0KCQkgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpe30KCQlyZXR1cm4gdXJsOwoJfQp9Cg==