LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiCgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3OwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuQ29udGVudFZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLkVkaXRhYmxlQ29udGVudFZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLk1vbml0b3JVSVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLnVpLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5CeXRlVmlld2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlld2Vycy5IZWFkZXJWaWV3ZXI7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBWaWV3ZXJNYW5hZ2VyIGltcGxlbWVudHMgSVZpZXdlck1hbmFnZXJ7Cglwcml2YXRlIGJvb2xlYW4gZGlzcGxheUhlYWRlckluZjsKCglwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXFWaWV3ZXI7Cglwcm90ZWN0ZWQgQ29udGVudFZpZXdlciByZXNwVmlld2VyOwoKCXByb3RlY3RlZCBIZWFkZXJWaWV3ZXIgcmVxSGVhZGVyOwoJcHJvdGVjdGVkIEhlYWRlclZpZXdlciByZXNwSGVhZGVyOwoKCXByb3RlY3RlZCBDb21wb3NpdGUgcmVxSENvbXA7Cglwcm90ZWN0ZWQgQ29tcG9zaXRlIHJlcVZDb21wOwoKCXByb3RlY3RlZCBDb21wb3NpdGUgcmVzcEhDb21wOwoJcHJvdGVjdGVkIENvbXBvc2l0ZSByZXNwVkNvbXA7CgoJcHJvdGVjdGVkIExpc3Qgdmlld2VyczsKCglwcm90ZWN0ZWQgSVJlcXVlc3QgcmVxdWVzdDsKCglwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwoKCXB1YmxpYyBWaWV3ZXJNYW5hZ2VyKENvbXBvc2l0ZSByZXFIZWFkUGFyZW50LCBDb21wb3NpdGUgcmVxVmlld1BhcmVudCwgQ29tcG9zaXRlIHJlc3BIZWFkUGFyZW50LCBDb21wb3NpdGUgcmVzcFZpZXdQYXJlbnQpIHsKCQlyZXFIQ29tcCA9IHJlcUhlYWRQYXJlbnQ7CgkJcmVzcEhDb21wID0gcmVzcEhlYWRQYXJlbnQ7CgkJcmVxVkNvbXAgPSByZXFWaWV3UGFyZW50OwoJCXJlc3BWQ29tcCA9IHJlc3BWaWV3UGFyZW50OwoJCXJlcUhlYWRlciA9IG5ldyBIZWFkZXJWaWV3ZXIocmVxSENvbXAsIEhlYWRlclZpZXdlci5SRVFVRVNUX0hFQURFUik7CgkJcmVzcEhlYWRlciA9IG5ldyBIZWFkZXJWaWV3ZXIocmVzcEhDb21wLCBIZWFkZXJWaWV3ZXIuUkVTUE9OU0VfSEVBREVSKTsKCQlyZXFWaWV3ZXIgPSBuZXcgQnl0ZVZpZXdlcigpOwoJCXJlcVZpZXdlci5pbml0KHJlcVZDb21wKTsKCQlyZXNwVmlld2VyID0gbmV3IEJ5dGVWaWV3ZXIoKTsKCQlyZXNwVmlld2VyLmluaXQocmVzcFZDb21wKTsKCQlzZXREaXNwbGF5SGVhZGVySW5mbyhNb25pdG9yVUlQbHVnaW4uZ2V0U2hvd0hlYWRlclByZWZlcmVuY2UoKSk7CgkJc2V0QXZhaWxhYmxlVmlld2VycygpOwoJfQoKCXByaXZhdGUgdm9pZCBzZXRBdmFpbGFibGVWaWV3ZXJzKCkgewoJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CgkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2YgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoTW9uaXRvclVJUGx1Z2luLlBMVUdJTl9JRCwgInZpZXdlcnMiKTsKCQlpbnQgc2l6ZSA9IGNmLmxlbmd0aDsKCQl2aWV3ZXJzID0gbmV3IEFycmF5TGlzdChzaXplKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQl2aWV3ZXJzLmFkZChjZltpXSk7CgkJfQoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNzZXREaXNwbGF5SGVhZGVySW5mbyhib29sZWFuKQoJICovCglwdWJsaWMgdm9pZCBzZXREaXNwbGF5SGVhZGVySW5mbyhib29sZWFuIGIpIHsKCQlkaXNwbGF5SGVhZGVySW5mID0gYjsKCQlyZXFIZWFkZXIuc2V0RGlzcGxheUhlYWRlcihiKTsKCQlyZXNwSGVhZGVyLnNldERpc3BsYXlIZWFkZXIoYik7CgkJTW9uaXRvclVJUGx1Z2luLnNldFNob3dIZWFkZXJQcmVmZXJlbmNlKGIpOwoJCWlmIChiKSB7CgkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZShmYWxzZSk7CgkJCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSVJlc2VuZFJlcXVlc3QgJiYgcmVxdWVzdC5nZXRSZXNwb25zZShJUmVxdWVzdC5UUkFOU1BPUlQpID09IG51bGwpIHsKCQkJCXJlcUhlYWRlci5zZXRFZGl0YWJsZSh0cnVlKTsKCQkJfQoJCX0KCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0RGlzcGxheUhlYWRlckluZm8oKQoJICovCglwdWJsaWMgYm9vbGVhbiBnZXREaXNwbGF5SGVhZGVySW5mbygpIHsKCQlyZXR1cm4gZGlzcGxheUhlYWRlckluZjsKCX0KCglwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KElSZXF1ZXN0IHJyKSB7CgkJLy8gTWFpbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSByZXF1ZXN0IGFuZCByZXF1ZXN0IGhlYWRlciBpZiB0aGV5J3ZlIGJlZW4gbW9kaWZpZWQuCgkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUmVzZW5kUmVxdWVzdAoJCQkJJiYgcmVxdWVzdC5nZXRSZXNwb25zZShJUmVxdWVzdC5BTEwpID09IG51bGwpIHsKCQkJaWYgKHJlcVZpZXdlciBpbnN0YW5jZW9mIEVkaXRhYmxlQ29udGVudFZpZXdlcikgewoJCQkJSVJlc2VuZFJlcXVlc3QgcmVzUmVxdWVzdCA9IChJUmVzZW5kUmVxdWVzdCkgcmVxdWVzdDsKCQkJCUVkaXRhYmxlQ29udGVudFZpZXdlciBlZGl0Vmlld2VyID0gKEVkaXRhYmxlQ29udGVudFZpZXdlcikgcmVxVmlld2VyOwoJCQkJYnl0ZVtdIGNvbnRlbnQgPSBlZGl0Vmlld2VyLmdldENvbnRlbnQoKTsKCQkJCWlmIChjb250ZW50ICE9IG51bGwgJiYgIU1vbml0b3JDb3JlLnBhcnNlKHJlc1JlcXVlc3QuZ2V0UmVxdWVzdChJUmVxdWVzdC5DT05URU5UKSkuZXF1YWxzKE1vbml0b3JDb3JlLnBhcnNlKGNvbnRlbnQpKSkgewoJCQkJCXJlc1JlcXVlc3Quc2V0UmVxdWVzdChjb250ZW50LCBJUmVxdWVzdC5DT05URU5UKTsKCQkJCX0KCQkJCWJ5dGVbXSBoZWFkZXIgPSByZXFIZWFkZXIuZ2V0Q29udGVudCgpOwoJCQkJaWYgKGhlYWRlciAhPSBudWxsICYmICFNb25pdG9yQ29yZS5wYXJzZShyZXNSZXF1ZXN0LmdldFJlcXVlc3QoSVJlcXVlc3QuVFJBTlNQT1JUKSkuZXF1YWxzKE1vbml0b3JDb3JlLnBhcnNlKGhlYWRlcikpKSB7CgkJCQkJcmVzUmVxdWVzdC5zZXRSZXF1ZXN0KGhlYWRlciwgSVJlcXVlc3QuVFJBTlNQT1JUKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXFIZWFkZXIuc2V0UmVxdWVzdFJlc3BvbnNlKHJyKTsKCQlyZXNwSGVhZGVyLnNldFJlcXVlc3RSZXNwb25zZShycik7CgkJYnl0ZVtdIGIgPSBudWxsOwoJCWlmIChyciAhPSBudWxsKQoJCQliID0gZmlsdGVyKHJyLmdldFJlcXVlc3QoSVJlcXVlc3QuQ09OVEVOVCkpOwoJCXJlcVZpZXdlci5zZXRDb250ZW50KGIpOwoJCWIgPSBudWxsOwoJCWlmIChyciAhPSBudWxsKQoJCQliID0gZmlsdGVyKHJyLmdldFJlc3BvbnNlKElSZXF1ZXN0LkNPTlRFTlQpKTsKCQlyZXNwVmlld2VyLnNldENvbnRlbnQoYik7CgkJcmVxdWVzdCA9IHJyOwoJCS8vIFNldCB0aGUgZWRpdG9yIHRvIGVkaXRhYmxlIGlmIHRoZSByZXF1ZXN0IGhhc24ndCAgYmVlbiBzZW50IGFuZCB0aGUKCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZS4KCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIElSZXNlbmRSZXF1ZXN0CgkJCQkmJiByZXF1ZXN0LmdldFJlc3BvbnNlKElSZXF1ZXN0LkFMTCkgPT0gbnVsbCkgewoJCQlpZiAoZGlzcGxheUhlYWRlckluZikgewoJCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKHRydWUpOwoJCQl9CgkJCWlmIChyZXFWaWV3ZXIgaW5zdGFuY2VvZiBFZGl0YWJsZUNvbnRlbnRWaWV3ZXIpCgkJCQkoKEVkaXRhYmxlQ29udGVudFZpZXdlcikgcmVxVmlld2VyKS5zZXRFZGl0YWJsZSh0cnVlKTsKCQl9IGVsc2UgewoJCQlpZiAoZGlzcGxheUhlYWRlckluZikgewoJCQkJcmVxSGVhZGVyLnNldEVkaXRhYmxlKGZhbHNlKTsKCQkJfQoJCQlpZiAocmVxVmlld2VyIGluc3RhbmNlb2YgRWRpdGFibGVDb250ZW50Vmlld2VyKQoJCQkJKChFZGl0YWJsZUNvbnRlbnRWaWV3ZXIpIHJlcVZpZXdlcikuc2V0RWRpdGFibGUoZmFsc2UpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSUNvbnRlbnRGaWx0ZXIgZmlsdGVyKSB7CgkJZmlsdGVycy5hZGQoZmlsdGVyKTsKCQlzZXRSZXF1ZXN0KHJlcXVlc3QpOwoJfQoKCXB1YmxpYyB2b2lkIHJlbW92ZUZpbHRlcihJQ29udGVudEZpbHRlciBmaWx0ZXIpIHsKCQlmaWx0ZXJzLnJlbW92ZShmaWx0ZXIpOwoJCXNldFJlcXVlc3QocmVxdWVzdCk7Cgl9CgoJcHJvdGVjdGVkIGJ5dGVbXSBmaWx0ZXIoYnl0ZVtdIGIpIHsKCQlpZiAoYiA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQlJdGVyYXRvciBpdGVyYXRvciA9IGZpbHRlcnMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCUlDb250ZW50RmlsdGVyIGZpbHRlciA9IChJQ29udGVudEZpbHRlcikgaXRlcmF0b3IubmV4dCgpOwoJCQl0cnkgewoJCQkJYiA9IGZpbHRlci5maWx0ZXIocmVxdWVzdCwgZmFsc2UsIGIpOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igd2hpbGUgZmlsdGVyaW5nIHdpdGggIiArIGZpbHRlci5nZXRJZCgpLCBlKTsKCQkJfQoJCX0KCQlyZXR1cm4gYjsKCX0KCgkvKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnRjcGlwLm1vbml0b3IuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRSZXF1ZXN0Vmlld2VycygpCgkgKi8KCXB1YmxpYyBMaXN0IGdldFJlcXVlc3RWaWV3ZXJzKCkgewoJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOwoJCUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCWVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7CgkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigicmVxdWVzdCIpID49IDApCgkJCQl0ZW1wLmFkZChlbGVtZW50KTsKCQl9CgkJcmV0dXJuIHRlbXA7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS50Y3BpcC5tb25pdG9yLmludGVybmFsLnZpZXcuSVZpZXdlck1hbmFnZXIjZ2V0UmVzcG9uc2VWaWV3ZXJzKCkKCSAqLwoJcHVibGljIExpc3QgZ2V0UmVzcG9uc2VWaWV3ZXJzKCkgewoJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdmlld2Vycy5pdGVyYXRvcigpOwoJCUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCWVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7CgkJCWlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigicmVzcG9uc2UiKSA+PSAwKQoJCQkJdGVtcC5hZGQoZWxlbWVudCk7CgkJfQoJCXJldHVybiB0ZW1wOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlcXVlc3RWaWV3ZXIoamF2YS5sYW5nLlN0cmluZykKCSAqLwoJcHVibGljIHZvaWQgc2V0UmVxdWVzdFZpZXdlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewoJCS8vIENhbGwgc2V0IHJlcXVlc3QgdG8gc2F2ZSBhbmQgcmVzZXQgdGhlIHJlcXVlc3QuCgkJc2V0UmVxdWVzdChyZXF1ZXN0KTsKCQlyZXFWaWV3ZXIuZGlzcG9zZSgpOwoJCXRyeSB7CgkJCXJlcVZpZXdlciA9IChDb250ZW50Vmlld2VyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIiwgZSk7CgkJfQoJCXJlcVZpZXdlci5pbml0KHJlcVZDb21wKTsKCQkvL3JlcVZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwoJCWJ5dGVbXSBiID0gbnVsbDsKCQlpZiAocmVxdWVzdCAhPSBudWxsKSB7CgkJCWIgPSBmaWx0ZXIocmVxdWVzdC5nZXRSZXF1ZXN0KElSZXF1ZXN0LkNPTlRFTlQpKTsKCQkJLy8gU2V0IHRoZSBlZGl0b3IgdG8gZWRpdGFibGUgaWYgdGhlIHJlcXVlc3QgaGFzbid0ICBiZWVuIHNlbnQgYW5kIHRoZQoJCQkvLyBlZGl0b3IgY2FuIGJlIHNldCBhcyBlZGl0YWJsZS4KCQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBJUmVzZW5kUmVxdWVzdAoJCQkJCSYmIHJlcXVlc3QuZ2V0UmVzcG9uc2UoSVJlcXVlc3QuVFJBTlNQT1JUKSA9PSBudWxsKSB7CgkJCQlpZiAocmVxVmlld2VyIGluc3RhbmNlb2YgRWRpdGFibGVDb250ZW50Vmlld2VyKQoJCQkJCSgoRWRpdGFibGVDb250ZW50Vmlld2VyKSByZXFWaWV3ZXIpLnNldEVkaXRhYmxlKHRydWUpOwoJCQl9IGVsc2UgewoJCQkJaWYgKHJlcVZpZXdlciBpbnN0YW5jZW9mIEVkaXRhYmxlQ29udGVudFZpZXdlcikKCQkJCQkoKEVkaXRhYmxlQ29udGVudFZpZXdlcikgcmVxVmlld2VyKS5zZXRFZGl0YWJsZShmYWxzZSk7CgkJCX0KCQl9CgkJcmVxVmlld2VyLnNldENvbnRlbnQoYik7CgkJcmVxVkNvbXAubGF5b3V0KHRydWUpOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UudGNwaXAubW9uaXRvci5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI3NldFJlc3BvbnNlVmlld2VyKGphdmEubGFuZy5TdHJpbmcpCgkgKi8KCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlVmlld2VyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CgkJcmVzcFZpZXdlci5kaXNwb3NlKCk7CgkJdHJ5IHsKCQkJcmVzcFZpZXdlciA9IChDb250ZW50Vmlld2VyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIiwgZSk7CgkJfQoJCXJlc3BWaWV3ZXIuaW5pdChyZXNwVkNvbXApOwoJCS8vcmVzcFZpZXdlci5zZXRSZXF1ZXN0UmVzcG9uc2UocnIpOwoJCWJ5dGVbXSBiID0gbnVsbDsKCQlpZiAocmVxdWVzdCAhPSBudWxsKQoJCQliID0gZmlsdGVyKHJlcXVlc3QuZ2V0UmVzcG9uc2UoSVJlcXVlc3QuQ09OVEVOVCkpOwoJCXJlc3BWaWV3ZXIuc2V0Q29udGVudChiKTsKCQlyZXNwVkNvbXAubGF5b3V0KHRydWUpOwoJfQoKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IudWkuaW50ZXJuYWwudmlldy5JVmlld2VyTWFuYWdlciNnZXRDdXJyZW50UmVxdWVzdFZpZXdlcigpCgkgKi8KCXB1YmxpYyBDb250ZW50Vmlld2VyIGdldEN1cnJlbnRSZXF1ZXN0Vmlld2VyKCkgewoJCXJldHVybiByZXFWaWV3ZXI7Cgl9CgoJLyogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aS5pbnRlcm5hbC52aWV3LklWaWV3ZXJNYW5hZ2VyI2dldEN1cnJlbnRSZXF1ZXN0SGVhZGVyVmlld2VyKCkKCSAqLwoJcHVibGljIEhlYWRlclZpZXdlciBnZXRDdXJyZW50UmVxdWVzdEhlYWRlclZpZXdlcigpIHsKCQlyZXR1cm4gcmVxSGVhZGVyOwoJfQp9