LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgogKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAyMDA2MDEwNiAgIDEyMTE5OSBqZXNwZXJAc2Vsc2thYmV0Lm9yZyAtIEplc3BlciBN+GxsZXIKICogMjAwNjAzMjEgICAxMjg4Mjcgam9hbiAtIEpvYW4gSGFnZ2FydHksIHJlbW92ZSByZWR1bmRhbnQgd3NkbCBVUkksIGZvbGRlciBhbmQgZmlsZSBjb250cm9scwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5BeGlzQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuQXhpc0NyZWF0aW9uVUlNZXNzYWdlczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5Db25zdW1wdGlvblVJTWVzc2FnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwoKCnB1YmxpYyBjbGFzcyBTa2VsZXRvbkNvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgp7CiAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwoKICAvKiBDT05URVhUX0lEIFBCU0MwMDAxIGZvciB0aGUgU2tlbGV0b24gQ29uZmlnIFBhZ2UgKi8KICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQlNDX1BBR0UgPSAiUEJTQzAwMDEiOyAvLyROT04tTkxTLTEkCiAgCiAgLy8gcHJpdmF0ZSBUZXh0IHVyaVRleHRfOwogIC8qIENPTlRFWFRfSUQgUEJDRjAwMDIgZm9yIHRoZSBVUkkgZmllbGQgb2YgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KICAvL3ByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9URVhUX1VSSSA9ICJQQkNGMDAwMiI7IC8vJE5PTi1OTFMtMSQKICAKICBwcml2YXRlIENvbWJvIHNrZWxldG9uRm9sZGVyVGV4dF87CiAgLyogQ09OVEVYVF9JRCBQQlNDMDAwNCBmb3IgdGhlIFNrZWxldG9uIEZvbGRlciBmaWVsZCBvZiB0aGUgU2tlbGV0b24gQ29uZmlnIFBhZ2UgKi8KICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSID0gIlBCU0MwMDA0IjsgLy8kTk9OLU5MUy0xJAoKCiAgLyogQ09OVEVYVF9JRCBQQlNDMDAwNSBmb3IgdGhlIFNrZWxldG9uIEZvbGRlciBCcm93c2UgYnV0dG9uIG9mIHRoZSBTa2VsZXRvbiBDb25maWcgUGFnZSAqLwogIC8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0UgPSAiUEJTQzAwMDUiOyAvLyROT04tTkxTLTEkCiAgLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJTQ19CVVRUT05fU0tFTEVUT05fRk9MREVSX0JST1dTRSA9ICJUT09MVElQX1BCU0NfQlVUVE9OX1NLRUxFVE9OX0ZPTERFUl9CUk9XU0UiOwogIAogIHByaXZhdGUgQnV0dG9uIHNob3dNYXBwaW5nc0NoZWNrYm94XzsKICAvKiBDT05URVhUX0lEIFBCU0MwMDE2IGZvciB0aGUgU2hvdyBNYXBwaW5ncyBjaGVja2JveCBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgICovCiAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9OMlBfU0hPV19NQVBQSU5HUyA9ICJQQlNDMDAxNiI7IC8vJE5PTi1OTFMtMSQKICAKICBwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3RfOwoJCiAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQogIHsKICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwogICAgCiAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgICAgICAgID0gbmV3IFVJVXRpbHMoIHBsdWdpbklkICk7CiAgICBVSVV0aWxzICAgICAgY29uVWlVdGlscyAgICAgID0gbmV3IFVJVXRpbHMoIHBsdWdpbklkICk7CiAgICBVSVV0aWxzICAgICAgYmFzZUNvblVpVXRpbHMgID0gbmV3IFVJVXRpbHMoIHBsdWdpbklkICk7CgogIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkICsgIi4iICsgIElORk9QT1BfUEJTQ19QQUdFICk7CiAgCXBhcmVudC5zZXRUb29sVGlwVGV4dCggQXhpc0NyZWF0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BCU0NfUEFHRSApOwogICAgCiAgICBDb21wb3NpdGUgdGV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiwgMCwgMCApOwoKICAgIC8qCiAgICB1cmlUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggdGV4dEdyb3VwLCAiTEFCRUxfVVJJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9VUkksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfVVJJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwogICAgKi8KICAgIAogICAgc2tlbGV0b25Gb2xkZXJUZXh0XyA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXh0R3JvdXAsIENvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9TS0VMRVRPTl9ST09UX05BTUUsCiAgICAJCUNvbnN1bXB0aW9uVUlNZXNzYWdlcy5UT09MVElQX1BCU0NfVEVYVF9TS0VMRVRPTl9GT0xERVIsCiAgICAgICAgSU5GT1BPUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSLAogICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwoKICAgIHNob3dNYXBwaW5nc0NoZWNrYm94XyA9IGNvblVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgQXhpc0NvbnN1bXB0aW9uVUlNZXNzYWdlcy5MQUJFTF9FWFBMT1JFX01BUFBJTkdTX1hNTDJCRUFOLAogICAgCQkJCQkJCQkJCQkJCUF4aXNDb25zdW1wdGlvblVJTWVzc2FnZXMuVE9PTFRJUF9OMlBfU0hPV19NQVBQSU5HUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgKTsKICAgICAgICAKICAgIHJldHVybiB0aGlzOwogIH0KICAKICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludFVSSShTdHJpbmcgZW5kcG9pbnRVUkkpCiAgewogIAkvKgogICAgaWYgKGVuZHBvaW50VVJJICE9IG51bGwpCiAgICAgIHVyaVRleHRfLnNldFRleHQoZW5kcG9pbnRVUkkpOwogICAgKi8KICB9ICAKICAKICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRKYXZhRm9sZGVyKFN0cmluZyBvdXRwdXRKYXZhRm9sZGVyKQogIHsKICAgIGlmIChvdXRwdXRKYXZhRm9sZGVyICE9IG51bGwpCiAgICB7CiAgICAgIGludCBpbmRleCA9IHNrZWxldG9uRm9sZGVyVGV4dF8uaW5kZXhPZihvdXRwdXRKYXZhRm9sZGVyKTsKICAgICAgaWYgKGluZGV4ICE9IC0xKQogICAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2VsZWN0KGluZGV4KTsKICAgICAgZWxzZSBpZiAoc2tlbGV0b25Gb2xkZXJUZXh0Xy5nZXRJdGVtQ291bnQoKSA8PSAwKQogICAgICB7CiAgICAgICAgU3RyaW5nIHJvb3QgPSBnZXRXb3Jrc3BhY2VSb290TG9jYXRpb24oKTsKICAgICAgICBpZiAob3V0cHV0SmF2YUZvbGRlci5zdGFydHNXaXRoKHJvb3QpKQogICAgICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZXRUZXh0KG91dHB1dEphdmFGb2xkZXIuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpKTsKICAgICAgICBlbHNlCiAgICAgICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNldFRleHQob3V0cHV0SmF2YUZvbGRlcik7CiAgICAgIH0KICAgIH0KICB9CiAgCiAgcHVibGljIHZvaWQgc2V0U2hvd01hcHBpbmcoYm9vbGVhbiBzaG93TWFwcGluZykKICB7CiAgICBzaG93TWFwcGluZ3NDaGVja2JveF8uc2V0U2VsZWN0aW9uKHNob3dNYXBwaW5nKTsKICB9CiAgCiAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd01hcHBpbmcoKQogIHsKICAgIHJldHVybiBzaG93TWFwcGluZ3NDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCk7CiAgfQoKICAvKioKICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCiAgICovCiAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7CgovLwkgIERvIG5vdCBiYXNlIEphdmEgb3V0cHV0IGRpcmVjdG9yeSBvbiB3b3Jrc3BhY2Ugcm9vdCBzaW5jZSB0aGUgcHJvamVjdCBjb3VsZCBiZSBub3QgCi8vCSAgcGh5c2ljYWxseSBsb2NhdGVkIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCwgZ2V0IHRoZSBwcm9qZWN0IHNwZWNpZmljIHJvb3QgaW5zdGVhZAoJICAKCSAgU3RyaW5nIHByb2plY3RTcGVjaWZpY1Jvb3QgPSBzZXJ2ZXJQcm9qZWN0Xy5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CgkgIFN0cmluZyBza2VsZXRvbkZvbGRlciA9IHNrZWxldG9uRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwoJICBTdHJpbmcgcHJvamVjdFBhdGhTdHJpbmcgPSBzZXJ2ZXJQcm9qZWN0Xy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7CgkgIGlmIChza2VsZXRvbkZvbGRlci5zdGFydHNXaXRoKHByb2plY3RQYXRoU3RyaW5nKSkgewoJCSAgc2tlbGV0b25Gb2xkZXIgPSBza2VsZXRvbkZvbGRlci5zdWJzdHJpbmcocHJvamVjdFBhdGhTdHJpbmcubGVuZ3RoKCkpOwoJICB9CgkgIGphdmFXU0RMUGFyYW0uc2V0SmF2YU91dHB1dChwcm9qZWN0U3BlY2lmaWNSb290ICsgc2tlbGV0b25Gb2xkZXIpOwoJICByZXR1cm4gamF2YVdTRExQYXJhbTsKICB9CgogIC8qKgogICAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldC4KICAgKi8KICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKCSAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKICB9CiAgCiAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKICB7CgkgIHNlcnZlclByb2plY3RfID0gc2VydmljZVByb2plY3Q7CiAgICBTdHJpbmcgb3JpZ2luYWxTa2VsZXRvbkZvbGRlciA9IHNrZWxldG9uRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwogICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5yZW1vdmVBbGwoKTsKICAgIElQYXRoW10gcGF0aHMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMoc2VydmljZVByb2plY3QpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGggOyBpKyspCiAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uYWRkKHBhdGhzW2ldLnRvU3RyaW5nKCkpOwogICAgaW50IGluZGV4ID0gc2tlbGV0b25Gb2xkZXJUZXh0Xy5pbmRleE9mKG9yaWdpbmFsU2tlbGV0b25Gb2xkZXIpOwogICAgaWYgKGluZGV4ICE9IC0xKQogICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNlbGVjdChpbmRleCk7CiAgICBlbHNlCiAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2VsZWN0KDApOwogIH0KICAKICBwcml2YXRlIFN0cmluZyBnZXRXb3Jrc3BhY2VSb290TG9jYXRpb24oKQogIHsKICAJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCk7CiAgfQp9Cg==