cGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnZpZXdlcnM7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgUnVudGltZVR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewoJcHJvdGVjdGVkIElSdW50aW1lVHlwZSBzZWxlY3Rpb247Cglwcm90ZWN0ZWQgUnVudGltZVR5cGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjsKCXByb3RlY3RlZCBib29sZWFuIGNyZWF0aW9uOwoJcHJvdGVjdGVkIFN0cmluZyB0eXBlOwoJcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uOwoJcHJvdGVjdGVkIFN0cmluZyBydW50aW1lVHlwZUlkOwoJCglwcm90ZWN0ZWQgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxTZWxlY3Rpb24gPSB0cnVlOwoJCglwdWJsaWMgaW50ZXJmYWNlIFJ1bnRpbWVUeXBlU2VsZWN0aW9uTGlzdGVuZXIgewoJCXB1YmxpYyB2b2lkIHJ1bnRpbWVUeXBlU2VsZWN0ZWQoSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKTsKCX0KCQoJcHVibGljIFJ1bnRpbWVUeXBlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgYm9vbGVhbiBjcmVhdGlvbiwgUnVudGltZVR5cGVTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcjIsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHJ1bnRpbWVUeXBlSWQpIHsKCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXIyOwoJCXRoaXMuY3JlYXRpb24gPSBjcmVhdGlvbjsKCQl0aGlzLnR5cGUgPSB0eXBlOwoJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CgkJdGhpcy5ydW50aW1lVHlwZUlkID0gcnVudGltZVR5cGVJZDsKCQoJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBSdW50aW1lVHlwZVRyZWVDb250ZW50UHJvdmlkZXIoUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyLlNUWUxFX1ZFTkRPUiwgY3JlYXRpb24sIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpOwoJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CgkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBSdW50aW1lVHlwZVRyZWVMYWJlbFByb3ZpZGVyKCkpOwoJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoQWJzdHJhY3RUcmVlQ29udGVudFByb3ZpZGVyLlJPT1QpOwoKCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKCQkJCU9iamVjdCBvYmogPSBnZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwoJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewoJCQkJCXNlbGVjdGlvbiA9IChJUnVudGltZVR5cGUpIG9iajsKCQkJCQlzZXREZXNjcmlwdGlvbihzZWxlY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSk7CgkJCQl9IGVsc2UgewoJCQkJCXNlbGVjdGlvbiA9IG51bGw7CgkJCQkJc2V0RGVzY3JpcHRpb24oIiIpOwoJCQkJfQoJCQkJbGlzdGVuZXIucnVudGltZVR5cGVTZWxlY3RlZChzZWxlY3Rpb24pOwoJCQl9CgkJfSk7CgkJCgkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CgkJCQlpZiAoZTEgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUgJiYgIShlMiBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkpCgkJCQkJcmV0dXJuIDE7CgkJCQlpZiAoIShlMSBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgJiYgZTIgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpCgkJCQkJcmV0dXJuIC0xOwoJCQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUgJiYgZTIgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpKQoJCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKCQkJCUlSdW50aW1lVHlwZSByMSA9IChJUnVudGltZVR5cGUpIGUxOwoJCQkJSVJ1bnRpbWVUeXBlIHIyID0gKElSdW50aW1lVHlwZSkgZTI7CgkJCQlpZiAocjEuZ2V0T3JkZXIoKSA+IHIyLmdldE9yZGVyKCkpCgkJCQkJcmV0dXJuIC0xOwoJCQkJZWxzZSBpZiAocjEuZ2V0T3JkZXIoKSA8IHIyLmdldE9yZGVyKCkpCgkJCQkJcmV0dXJuIDE7CgkJCQllbHNlCgkJCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwoJCQl9CgkJfSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CgkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKCQlpZiAodmlzaWJsZSAmJiBpbml0aWFsU2VsZWN0aW9uKSB7CgkJCWluaXRpYWxTZWxlY3Rpb24gPSBmYWxzZTsKCQkJaWYgKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkgIT0gbnVsbCkKCQkJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRlbnRQcm92aWRlci5nZXRJbml0aWFsU2VsZWN0aW9uKCkpLCB0cnVlKTsKCQl9Cgl9CgkKCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGVMYWJlbCgpIHsKCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVydW50aW1lVHlwZUNvbXBUcmVlIik7Cgl9CgoJcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbkxhYmVsKCkgewoJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXJ1bnRpbWVUeXBlQ29tcERlc2NyaXB0aW9uIik7Cgl9CgoJcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbWJvT3B0aW9ucygpIHsKCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVuYW1lIiksCgkJCVNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIldmVuZG9yIiksIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIldmVyc2lvbiIpLAoJCQlTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJW1vZHVsZVN1cHBvcnQiKSB9OwoJfQoKCXByb3RlY3RlZCB2b2lkIHZpZXdPcHRpb25TZWxlY3RlZChieXRlIG9wdGlvbikgewoJCUlTZWxlY3Rpb24gc2VsID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUnVudGltZVR5cGVUcmVlQ29udGVudFByb3ZpZGVyKG9wdGlvbiwgY3JlYXRpb24sIHR5cGUsIHZlcnNpb24sIHJ1bnRpbWVUeXBlSWQpKTsKCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwoJfQoKCXB1YmxpYyBJUnVudGltZVR5cGUgZ2V0U2VsZWN0ZWRSdW50aW1lVHlwZSgpIHsKCQlyZXR1cm4gc2VsZWN0aW9uOwoJfQp9